Russian Qt Forum
Ноябрь 01, 2024, 11:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Один QHeaderView для нескольких таблиц  (Прочитано 4350 раз)
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();
}

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



При этом, если в последней вкладке (в которой заголовок отображается корректно), изменить ширину или порядок столбцов, то они меняются и в других вкладках, то есть фактически хедер установился, но не отображается! Что надо сделать, чтобы он отобразился? Или, если я ерунду творю, наставьте меня на путь истинный, ибо я только учусь.
Спасибо заранее.
Записан
carrygun
Гость
« Ответ #1 : Ноябрь 18, 2012, 08:59 »

Ну попробуй для начала show() у хедера вызывать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #2 : Ноябрь 18, 2012, 10:28 »

нельзя, чтобы один виджет использовался в разных местах одновременно. создай «копии» хедера, а при изменении ширины/порядка отправляй сигнал.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
UNION labs
Гость
« Ответ #3 : Ноябрь 18, 2012, 12:28 »

На мой взгляд лучше использовать QTabBar вместо QTabWidget'a. Таким образом получится одна модель и один вид, а при смене вкладок к модели применять необходимые фильтры.
« Последнее редактирование: Ноябрь 18, 2012, 14:09 от dimkanovikov » Записан
qks1
Гость
« Ответ #4 : Ноябрь 18, 2012, 19:50 »

На мой взгляд лучше использовать QTabBar вместо QTabWidget'a.

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

Короче, покурив исходники, понял, что дело всё в setParent. Сделал, чтобы при смене вкладки в качестве родителя для хедера устанавливался QTableView с текущей вкладки - всё заработало как надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.152 секунд. Запросов: 23.