Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: qks1 от Ноябрь 18, 2012, 08:04



Название: Один QHeaderView для нескольких таблиц
Отправлено: qks1 от Ноябрь 18, 2012, 08:04
Доброго времени!
Есть необходимость создать табвиджет с однотипными таблицами на каждой вкладке (данные будут браться из одной БД, но фильтры будут применяться разные). При этом, если в одной из вкладок пользователь изменяет размеры столбцов или их порядок - те же изменения должны происходить и в остальных вкладках. Самое очевидное, как мне казалось, решение - создать один горизонтальный хедер и подсунуть его каждой таблице. Простейший код:

Код
C++ (Qt)
#include <QtGui>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QTabWidget w;
   QTableView table1;
   QTableView table2;
   QTableView table3;
   QHeaderView header(Qt::Horizontal);
   QStandardItemModel model(5,5);
 
   for(int i = 0; i < model.rowCount(); i++){
       for(int j = 0; j < model.columnCount(); j++)
           model.setData(model.index(i,j), i*j);
   }
 
   table1.setModel(&model);
   table2.setModel(&model);
   table3.setModel(&model);
 
   header.setMovable(true);
   table1.setHorizontalHeader(&header);
   table2.setHorizontalHeader(&header);
   table3.setHorizontalHeader(&header);
 
   w.addTab(&table1, "table1");
   w.addTab(&table2, "table2");
   w.addTab(&table3, "table3");
 
   w.setWindowTitle("TEST");
   w.show();
 
   return a.exec();
}

Но не тут-то было: во всех вкладках, кроме последней, вместо заголовка зияла пустота:

(http://cs407621.userapi.com/v407621008/3368/9LMle3Qfb-o.jpg)

При этом, если в последней вкладке (в которой заголовок отображается корректно), изменить ширину или порядок столбцов, то они меняются и в других вкладках, то есть фактически хедер установился, но не отображается! Что надо сделать, чтобы он отобразился? Или, если я ерунду творю, наставьте меня на путь истинный, ибо я только учусь.
Спасибо заранее.


Название: Re: Один QHeaderView для нескольких таблиц
Отправлено: carrygun от Ноябрь 18, 2012, 08:59
Ну попробуй для начала show() у хедера вызывать.


Название: Re: Один QHeaderView для нескольких таблиц
Отправлено: kambala от Ноябрь 18, 2012, 10:28
нельзя, чтобы один виджет использовался в разных местах одновременно. создай «копии» хедера, а при изменении ширины/порядка отправляй сигнал.


Название: Re: Один QHeaderView для нескольких таблиц
Отправлено: UNION labs от Ноябрь 18, 2012, 12:28
На мой взгляд лучше использовать QTabBar вместо QTabWidget'a. Таким образом получится одна модель и один вид, а при смене вкладок к модели применять необходимые фильтры.


Название: Re: Один QHeaderView для нескольких таблиц
Отправлено: qks1 от Ноябрь 18, 2012, 19:50
На мой взгляд лучше использовать QTabBar вместо QTabWidget'a.

На вкладках будут и другие виджеты, так что плохой вариант.

Короче, покурив исходники, понял, что дело всё в setParent. Сделал, чтобы при смене вкладки в качестве родителя для хедера устанавливался QTableView с текущей вкладки - всё заработало как надо.