LINUX.ORG.RU

автоматически менять ширину столбца QTableView

 


0

2

Как заставить столбцы увеличиваться в соответствии с размером контекста?

Делал так, в конструкторе своего виджета

model = new MyTableModel;
// ...
view = new MyTableView;
layout->addWidget(view);
//...

Причем model и view члены класса собственного виджета.

перегрузил

void MyTableView::resizeEvent(QResizeEvent *event)
{
  resizeRowsToContents();
  resizeColumnsToContents();
}

ну и выбор таблицы происходит в отдельном слоте:

model->setTable("TestTable");
view->setModel(model);
model->setHeaderData(1,Qt::Horizontal,tr("Имя")); 
// ...
model->select();
view->hideColumn(0); // idx
updateGeometry();

Проблема: при выборе первой таблицы, ширина столбцов подгоняется под размер столбца. А при выборе второй, третьей ... таблиц ширина столбцов уже не менятется.

Отводящий вопрос. А если в тексте ячейки будет слово из 150 букв без пробелов, то тоже надо менять ширину под него?

bvn13 ★★★★★
()

ЯННП.

У тебя в одной модельке несколько таблиц? А data() при model->setTable("TestTable"); меняется? А если вместо updateGeometry(); воткнуть resizeColumnsToContents();

Stil ★★★★★
()

Для Qt4.

view->horizontalHeader()->setResizeMode( QHeaderView::ResizeToContents );

Можно также для отдельного столбца

view->horizontalHeader()->setResizeMode( column, QHeaderView::ResizeToContents );

В Qt5 метод поменял название на setSectionResizeMode

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от Stil

да, одна модель работает с разными таблицами.

слот такой:

switch(item->data(Qt::UserRole).toInt())
  {
        case TABLE1:
            model->setTable("Table1");
            view->setModel(model);
            model->setHeaderData(1,"...")); 
            // ...  
        break;
        case TABLE2:
            model->setTable("Table2");
            view->setModel(model);
            model-setHeaderData(1,"..."); 
        break;
        // ...
    }
model->select();
updateGeometry(); 

в колонках текст с ограниченным числом символов и колонок мало. Все красиво входит если распахивать.

Чем бы вызвать обработчик события resizeEvent, updateGeometry это делает только в первый раз. Вот этот момент мне абсолютно не понятен.

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

при этом все конечно же отлично выравнивается, если главное окно меняет размеры при манипуляция мышкой ...

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

Там видимо оптимизации: resizeEvent функциями Qt зря не вызывается, если размеры не изменились, то зачем его лишний раз дергать?

grondek
()
void MyTableView::resizeEvent(QResizeEvent *event)
{
  resizeRowsToContents();
  resizeColumnsToContents();
}

А родительский метод кто вызывать будет?

grondek
()
Ответ на: комментарий от grondek

А родительский метод кто вызывать будет?

можно вызвать, но проблема не решается

void MyTableView::resizeEvent(QResizeEvent *event)
{
  QTableView::resizeEvent(event);
  resizeRowsToContents();
  resizeColumnsToContents();
}
developer-cpp
() автор топика
Ответ на: комментарий от grondek

Там видимо оптимизации: resizeEvent функциями Qt зря не вызывается, если размеры не изменились, то зачем его лишний раз дергать?

а чем можно заставить вызываться resizeEvent насильно? На практке вижу что updateGeometry() не подходит.

developer-cpp
() автор топика
Ответ на: комментарий от grondek

view->horizontalHeader()->setResizeMode( QHeaderView::ResizeToContents );

Спасибо, подходит конечно же это решение.

мне просто уже интересно с обработкой события resizeEvent разобраться

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

Как бы событие изменения размера виджета и изменение размеров столбцов - несколько разные вещи.

Просто посмотри код QWidget::updateGeometry, зачем гадать-то )

grondek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.