Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Cyrax от Декабрь 19, 2007, 11:32



Название: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 19, 2007, 11:32
Есть ли готовые классы для создания таблиц с иерархическими заголовками ?
Ни поиск по форуму, ни гуглинг абсолютно ничего не дал, как будто таких задач в истории человечества не возникало...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Kainit от Декабрь 19, 2007, 14:53
Цитировать
Ни поиск по форуму, ни гуглинг абсолютно ничего не дал
Гм, гм. На моей памяти тут порядка 10 тем с аналогичным вопросом.

Нету готовых классов, пишите сами кастомные хедеры, благо назначить их вьювам вы сможете.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 19, 2007, 15:27
Цитировать
Гм, гм. На моей памяти тут порядка 10 тем с аналогичным вопросом.
И как они формулировались ?
По "иерархичекие заголовки", "многоуровневые заголовки" даже по содержанию постов абсолютно ничего...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Kainit от Декабрь 19, 2007, 15:35
Вот, например, не так давно было
http://prog.org.ru/forum/index.php/topic,6504.0.html (http://prog.org.ru/forum/index.php/topic,6504.0.html)
честно, говорю, десяток наберётся, но ответ 1, в Qt нет таких классов, надо либо сторонние использовать компоненты, либо (что мы и с делали в своё время) свои писать.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 19, 2007, 21:19
1) http://prog.org.ru/forum/index.php/topic,1183.0.html
2) http://prog.org.ru/forum/index.php/topic,6227.0.html (капельку про Qicstable)
3) http://prog.org.ru/forum/index.php/topic,6504.0.html
И всё - больше нет.

По поводу Qics Table - только evaluate'ы бесплатно. Причём под win и mingw/gcc нет...
Тем более мне нужен под qt 4.1.4...

http://www.ics.com/download:

Qics Table - 2.3.2
 File File Size File Date Operating System   
qicstable-2.3.2-ia32-Fedora8-qt_4.3.2-st-eval.tar.gz 3.827 MB 11/26/2007 FEDORACORE           
qicstable-2.3.2-ia32-Fedora8-qt_4.3.0-st-eval.tar.gz 3.827 MB 11/26/2007 FEDORACORE           
qicstable-2.3.2-ia32-Fedora8-qt_4.2.3-st-eval.tar.gz 3.827 MB 11/26/2007 FEDORACORE           
qicstable-2.3.2-ia32-RHEL4-qt_4.3.2-st-eval.tar.gz 3.807 MB 11/26/2007 RHEL           
qicstable-2.3.2-ia32-RHEL4-qt_4.3.0-st-eval.tar.gz 3.807 MB 11/26/2007 RHEL           
qicstable-2.3.2-ia32-RHEL4-qt_4.2.3-st-eval.tar.gz 3.805 MB 11/26/2007 RHEL           
qicstable-2.3.2-ia32-SUSE10-qt_4.3.2-st-eval.tar.gz 3.818 MB 11/26/2007 SUSE           
qicstable-2.3.2-ia32-SUSE10-qt_4.3.0-st-eval.tar.gz 3.818 MB 11/26/2007 SUSE           
qicstable-2.3.2-ia32-SUSE10-qt_4.2.3-st-eval.tar.gz 3.817 MB 11/26/2007 SUSE           
qicstable-2.3.2-ia32-win-msvc2005-qt_4.3.2-eval.zip 4.695 MB 10/19/2007 WIN           
qicstable-2.3.2-ia32-win-msvc2003-qt_4.3.2-eval.zip 4.647 MB 10/19/2007 WIN           

Qics Table - 2.3.1
File File Size File Date Operating System   
qicstable-2.3.1-ia32-Fedora8-qt_4.3.2-st-eval.tar.gz 3.826 MB 11/26/2007 FEDORACORE           
qicstable-2.3.1-ia32-Fedora8-qt_4.3.0-st-eval.tar.gz 3.827 MB 11/26/2007 FEDORACORE           
qicstable-2.3.1-ia32-Fedora8-qt_4.2.3-st-eval.tar.gz 3.827 MB 11/26/2007 FEDORACORE           
qicstable-2.3.1-ia32-RHEL4-qt_4.3.2-st-eval.tar.gz 3.807 MB 11/26/2007 RHEL           
qicstable-2.3.1-ia32-RHEL4-qt_4.3.0-st-eval.tar.gz 3.807 MB 11/26/2007 RHEL           
qicstable-2.3.1-ia32-RHEL4-qt_4.2.3-st-eval.tar.gz 3.805 MB 11/26/2007 RHEL           
qicstable-2.3.1-ia32-SUSE10-qt_4.3.2-st-eval.tar.gz 3.818 MB 11/26/2007 SUSE           
qicstable-2.3.1-ia32-SUSE10-qt_4.3.0-st-eval.tar.gz 3.818 MB 11/26/2007 SUSE           
qicstable-2.3.1-ia32-SUSE10-qt_4.2.3-st-eval.tar.gz 3.817 MB 11/26/2007 SUSE           
qicstable-2.3.1-ia32-win-msvc2005-qt_4.3.2-eval.zip 4.266 MB 11/26/2007 WIN           

Qics Table - 2.1
File File Size File Date Operating System   
qicstable-2.1-ia32-linux-gcc_4.0.0-qt_4.2.2-eval.tar.gz 5.494 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-linux-gcc_3.3.3-qt_4.2.2-eval.tar.gz 2.802 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-linux-gcc_4.0.0-qt_4.2.0-eval.tar.gz 2.799 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-linux-gcc_3.3.3-qt_4.2.0-eval.tar.gz 2.802 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-linux-gcc_4.0.0-qt_4.1.4-eval.tar.gz 2.816 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-linux-gcc_3.3.3-qt_4.1.4-eval.tar.gz 2.815 MB 02/21/2007 LINUX           
qicstable-2.1-ia32-win-vs6-qt_4.2.2-eval.zip 3.236 MB 02/21/2007 WIN           
qicstable-2.1-ia32-win-msvc2005-qt_4.2.2-eval.zip 3.289 MB 02/21/2007 WIN           
qicstable-2.1-ia32-win-vs6-qt_4.2.0-eval.zip 3.236 MB 02/21/2007 WIN           
qicstable-2.1-ia32-win-msvc2005-qt_4.2.0-eval.zip 3.289 MB 02/21/2007 WIN           
qicstable-2.1-ia32-win-vs6-qt_4.1.4-eval.zip 3.227 MB 02/21/2007 WIN           
qicstable-2.1-ia32-win-msvc2005-qt_4.1.4-eval.zip 3.281 MB 02/21/2007 WIN           

Qics Table - 1.1.3
File File Size File Date Operating System   
qicstable-1.1.3-ia32-linux-gcc_4.1.1-qt_3.3.7-eval.tar.gz 2.567 MB 12/01/2006 LINUX           
qicstable-1.1.3-ia32-linux-gcc_3.3.3-qt_3.3.7-eval.tar.gz 2.557 MB 12/01/2006 LINUX           
qicstable-1.1.3-ia32-linux-gcc_4.1.1-qt_3.3.6-eval.tar.gz 5.170 MB 12/01/2006 LINUX           
qicstable-1.1.3-ia32-linux-gcc_3.4.3-qt_3.3.3-eval.tar.gz 5.253 MB 12/01/2006 LINUX           
qicstable-1.1.3-ia32-win-vs6-qt_3.3.7-eval.zip 2.955 MB 12/01/2006 WIN           
qicstable-1.1.3-ia32-win-msvc8-qt_3.3.7-eval.zip 2.983 MB 12/01/2006 WIN           
qicstable-1.1.3-ia32-win-msvc7-qt_3.3.7-eval.zip 3.017 MB 12/01/2006 WIN           
qicstable-1.1.3-ia32-win-vs6-qt_3.3.6-eval.zip 2.955 MB 12/01/2006 WIN           
qicstable-1.1.3-ia32-win-msvc8-qt_3.3.6-eval.zip 2.983 MB 12/01/2006 WIN           
qicstable-1.1.3-ia32-win-msvc7-qt_3.3.6-eval.zip 3.017 MB 12/01/2006 WIN           

Qics Table - 1.1.1
File File Size File Date Operating System   
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.3.4-eval.zip 1.583 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.3.3-commercial-eval.zip 1.573 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.3.3-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.3.2-commercial-eval.zip 1.573 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.3.2-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.3.1-commercial-eval.zip 1.573 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.3.1-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.2.3-commercial-eval.zip 1.617 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.2.3-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.2.2-commercial-eval.zip 1.573 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.2.2-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.2.1-commercial-eval.zip 1.578 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-msvc.net-commercial-mt-qt-3.2.1-eval.zip 1.582 MB 01/03/2006 WIN32           
qicstable-1.1.1-win32-vs6-mt-qt-3.2.0-commercial-eval.zip 1.572 MB 01/03/2006 WIN32           


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Декабрь 19, 2007, 21:37
блин, флудер...теперь все, кто будут искать qics, будут натыкаться на этот цифробуквенный понос :)

я за два вечера сделал то, что мне нужно (пока красоту не навёл, правда)...потрать пару вечеров тоже и сделай сам такое, какое нужно _тебе_
а если жаба потом не задушит, выложишь где-нть в пользу неимущих и обделённых...ну, если, конечно, сам не обделён )


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 19, 2007, 23:11
Цитировать
я за два вечера сделал то, что мне нужно (пока красоту не навёл, правда)...потрать пару вечеров тоже и сделай сам такое, какое нужно _тебе_
а если жаба потом не задушит, выложишь где-нть в пользу неимущих и обделённых...ну, если, конечно, сам не обделён )
Давай сделаем так. Ты мне выложишь свои наработки (может ещё кто, кто этим занимался). Я либо воспользуюсь этими наработками, либо по примеру слеплю свои. Собственно, опыт qt-ничать у меня минимальный, посему желательны какие-нибудь наработки. Сейчас мне это сильно поможет, потом выложить свой код проблем (ни со стороны жаб, ни стороны какой бы то нибыло ещё) не составит. Да потом и до ума его довести время будет.
Сейчас меня больше волнуют мои 3 недели...

з.ы. если что, могу зелёненьких факсом выслать...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Декабрь 19, 2007, 23:34
я не против зелёненьких факсом...но моя хидервьюха тебе не поможет, к сожалению - там часть кода от оригинального хидервью + моё рисовалко дополнительных элементов (кнопки сортировки, фильтрации) + отлов моусемуве/моусепрессед/моусерелизед...никаких иерархичеких заголовов и близко нет (моя задача совсем далека от твоей)
поскольку, тебе вряд ли хочется рабираться с рисованием субэлементов, возьми за основу код Barmaglodd из http://prog.org.ru/forum/index.php/topic,6508.0.html (http://prog.org.ru/forum/index.php/topic,6508.0.html). кривовато, правда, но работать будет...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: -QT- от Декабрь 20, 2007, 10:25
Ну и чем не нравиться ?

Цитировать
qicstable-2.1-ia32-linux-gcc_4.0.0-qt_4.2.2-eval.tar.gz 5.494 MB 02/21/2007 LINUX


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 20, 2007, 12:32
Ну и чем не нравиться ?

Цитировать
qicstable-2.1-ia32-linux-gcc_4.0.0-qt_4.2.2-eval.tar.gz 5.494 MB 02/21/2007 LINUX
1. нужны исходники под винду
2. у меня qt 4.1.4


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: pastor от Декабрь 20, 2007, 15:18
1. нужны исходники под винду

Халявные искодники ты врядли наёдешь


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 26, 2007, 23:30
Цитировать
поскольку, тебе вряд ли хочется рабираться с рисованием субэлементов, возьми за основу код Barmaglodd из http://prog.org.ru/forum/index.php/topic,6508.0.html. кривовато, правда, но работать будет...
А как сделать не криво, а нормально ?

Да и что там брать за основу - непонятно (в частности, что такое _model). Он ведь текст в заголовке поворачивает на 90 градусов путём перегрузки метода paintSection(). Мне же нужны иерархические заголовки (хотя бы 2 уровня)...

По поводу рисования субэлементов. Почему я должен рисовать субэлементы ?  Мне же нужно наоборот каким-то образом объединить соседние ячейки...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Декабрь 26, 2007, 23:52
если только объединить, юзай спан (поищи в доках по вьюхам - не помню как зовутся методы)
если же надо сделать заголовок по типу
+---------------------------------+
|               заголовок                  |
+---------------+-----------------+
|  заголовок.     |    заголовок      |
+---------------+-----------------+
|  данные(0,0)   |    данные(0,1)    |
+---------------+-----------------+
, то по-любому надо свои рисовалки проводить


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 27, 2007, 00:19
Цитировать
если только объединить, юзай спан
Под "объединить" я понимаю, что формируется одна надпись на области, занимаемой несколькими соседними ячейками. span делает что-то другое ?

Цитировать
то по-любому надо свои рисовалки проводить
Путём перегрузки PaintSection ?



Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: pastor от Декабрь 27, 2007, 00:35
Под "объединить" я понимаю, что формируется одна надпись на области, занимаемой несколькими соседними ячейками. span делает что-то другое ?

Цитировать
void QTableView::setSpan ( int row, int column, int rowSpan, int columnSpan )
Sets the span of the table element at (row, column) to (rowSpan, columnSpan).


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Декабрь 27, 2007, 00:38
кстати, это так и называется - "спан", а не "Иерархические заголовки"


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 27, 2007, 12:30
Цитировать
void QTableView::setSpan ( int row, int column, int rowSpan, int columnSpan )
Sets the span of the table element at (row, column) to (rowSpan, columnSpan).
Это у кого такой метод ?  Ни у QTableView, ни у QAbstractItemView такого нет...

Цитировать
кстати, это так и называется - "спан", а не "Иерархические заголовки"
Мне нужны именно иерархические заголовки, которые, собственно, можно реализовать через спан соседних ячеек. Только для этого потребуются многослойные header'ы, как минимум, двуслойные...


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Декабрь 27, 2007, 13:39
Это у кого такой метод ?  Ни у QTableView, ни у QAbstractItemView такого нет...
QTableView, начиная с 4.2
какая версия кутей?

Мне нужны именно иерархические заголовки, которые, собственно, можно реализовать через спан соседних ячеек. Только для этого потребуются многослойные header'ы, как минимум, двуслойные...
примерно то, что я нарисовал на пред.странице?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 27, 2007, 13:45
Цитировать
какая версия кутей?
4.1.4

Цитировать
примерно то, что я нарисовал на пред.странице?
Именно. Спан разве именно это не делает ?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Декабрь 28, 2007, 19:42
Может, кто-нибудь проверит, как работает span в Qt 4.2 и выше.
Интересует в первую очередь следующее:
Цитировать
+---------------------------------+
|               заголовок                  |
+---------------+-----------------+
|  заголовок.     |    заголовок      |
+---------------+-----------------+
|  данные(0,0)   |    данные(0,1)    |
+---------------+-----------------+
Такое можно сделать с помощью span'а (объединение 2-х верхних ячеек + надпись на области обоих ячеек, как будто это одна ячейка) ?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Cyrax от Январь 10, 2008, 23:57
Если воспользоваться span'ами, то нужно сделать QHeaderView в составе QTableView многоэтажным. Тогда вопрос будет решён. Останется только интерфейс своего TableView'а удобно оформить.
Если span'ы не использовать, то будет посложнее...

Ещё придётся каким-то образом "уложить" всю информацию, необходимую для заголовков в сигнатуру метода QTableView::headerData(), где секция задаётся одним целым числом. Одним целым числом задать фрагмент иерархического заголовка...
Можно, если формировать его, скажем, складывая по 1000 для каждого следующего уровня.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 02, 2008, 18:22
Если воспользоваться span'ами, то нужно сделать QHeaderView в составе QTableView многоэтажным. Тогда вопрос будет решён.

Подскажите, пожалуйста, как можно сделать QHeaderView многоэтажным?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 03, 2008, 15:15
Типа этого ? Три месяца мучался.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Пантер от Апрель 03, 2008, 15:49
Вот теперь расскажи всем как ты это намучил. ;)


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 04, 2008, 18:38
Типа этого ? Три месяца мучался.
Да, именно это :). Очень хотелось бы услышать, как это было сделано?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 05, 2008, 08:40
Шаг первый - описываю, пока, только стратегию т.к. времени мало.

Создаём свой класс QDataHeaderView - наследуемся от QHeaderView.
В нём создаём два члена
QStandardItemModel *headerModel; // Поскольку заголовок иерархический, то инфу о нём хранить будем в иерархической модели
int rowCountHeader; // Количество уровней в заголовке - равно максимальному количеству уровней в headerModel
Можно было эти два члена засунуть в класс Модели (возможно это и правильно с т.з. Qt), я и так пробовал и эдак - пока не принял окончательного решения где им быть.

перекрываем две функции
QSize sizeHint() const;
void paintSection(QPainter *painter, const QRect & rect, int logicalIndex) const;

Далее в Модель нахомячиваем описание заголовков. Я в Модели сделал QStringList для этого.
Храню как в EhLib C++Builder/Delphi - по привычке
Смотрите на рисунок нижнюю вьюху
0. Дата оплаты
1. Сумма оплаты
2. Ком. сбор
3. Период|Начало
4. Период|Конец
5. Лицевой счёт
6. Показания|День|Начальное
7. Показания|День|Конечное
8. Показания|Ночь|Начальное
9. Показания|Ночь|Конечное
Думаю принцип ясен.

Далее создаём функцию построения headerModel на основе этого списка, должно получится дерево.
По мере построения headerModel отслеживаем максимальную глубину и запоминаем в rowCountHeader
Функцию sizeHint() привожу в сокращённом виде, для простоты
QSize QDataHeaderView::sizeHint() const
{
   QSize size = QHeaderView::sizeHint(); // Высота одной строки родительского заголовка, которую он сам вычислил на основе текущего шрифта
   size.rheight() *= rowCountHeader; // Увеличиваем до нашего размерчика

   return size;
}
 
Далее создаём функцию
QVariant headerData(int Section, Qt::Orientation orientation, int nRole) const;
Вообще это функция Модели её там надо было перекрывать, но я сделал здесь, т.к. уже написал, что не принял оконч. решения где им быть.
Для работы headerData понадобятся две рекурсивные функции, которые по int Section будут возвращать номер начальной секции группы (ветки) в которую входит Section и номер конечной секции группы.

На основе информации из наших функций - рисуем через перекрытую paintSection
void QDataHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
 ...
}

Думаю моя стратегия ясна - остальное по ходу пьесы.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Апрель 05, 2008, 13:08
думаю, многие были бы благодарны, если б ты выложил рабочий код

и вообще можно было бы сделать публичный или закрытый раздел для обмена компонентами, на которые не накладывается коммерческая лицензия


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 05, 2008, 13:18
думаю, многие были бы благодарны, если б ты выложил рабочий код

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


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Апрель 05, 2008, 14:21
ну, будет время - милости просим

у меня тоже поднакопилось уже интересных решений. что-то уже отправил Троллям, что-то требует дошлифовки или более плотного тестирования. одному просто времени на всё не хватает.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Sergey B. от Апрель 09, 2008, 09:40
http://trolltech.com/developer/knowledgebase/faq.2007-09-26.7736043425/ (http://trolltech.com/developer/knowledgebase/faq.2007-09-26.7736043425/)


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Апрель 09, 2008, 11:13
http://trolltech.com/developer/knowledgebase/faq.2007-09-26.7736043425/ (http://trolltech.com/developer/knowledgebase/faq.2007-09-26.7736043425/)
страх какой!

Змеище, делись кодом :)


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 10, 2008, 08:39
Ну некогда мне чистить его - реально некогда.
Предлагаю так - я цепляю два файла myheader.h и myheader.cpp и изучайте их.
По мере возникновения вопросов я буду коротко отвечать на конкретный кусок кода.
В конце концов его оптимизировать надо - вот совместными усилиями предлагаю его довести до совершенства.
PS: Если надумаете его Тролям слить - про меня не забудте (ну хотя бы упомянуть) ;D


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 10, 2008, 08:45
Ну некогда мне чистить его - реально некогда.
Предлагаю так - я цепляю два файла myheader.h и myheader.cpp и изучайте их.
По мере возникновения вопросов я буду коротко отвечать на конкретный кусок кода.
В конце концов его оптимизировать надо - вот совместными усилиями предлагаю его довести до совершенства.
PS: Если надумаете его Тролям слить - про меня не забудте (ну хотя бы упомянуть) ;D


я - за! :)


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Апрель 10, 2008, 13:27
Ну некогда мне чистить его - реально некогда.
Предлагаю так - я цепляю два файла myheader.h и myheader.cpp и изучайте их.
По мере возникновения вопросов я буду коротко отвечать на конкретный кусок кода.
В конце концов его оптимизировать надо - вот совместными усилиями предлагаю его довести до совершенства.
PS: Если надумаете его Тролям слить - про меня не забудте (ну хотя бы упомянуть) ;D
Троллям я отправляю только свой код (а в данном случае Тролли и не заинтересуются данным решением как минимум в ближайшее время)

если ничего не мешает, скинь код в ЛС. использовать такой хидер мне пока негде, но ознакомиться с решением интересно (особенно, если у хидера не только скриншоты симпатичные :) )


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 10, 2008, 14:45
Вот архивчик на 3Кб. Скудные комментарии в кодировке UTF8


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 14, 2008, 16:08
QSocketDataSet *cds - это модель - ессно моя модель.

QSocketDataSet это наследник от QDataSet, а QDataSet наследник от QAbstractTableModel.

Это я создавал смесь моделей Qt и билдеровского TClientDataSet.
В двух словах это трёхзвенка для работы с БД.

Сервер приложений тянет данные из БД и гонит по сокету на клиента
QSocketDataSet на клиенте вытягивает их из сокета. Для того, чтобы показывать это во вьюхах пришлось
скрестить с QAbstractTableModel и перекрыть некоторые функции.

Что касается сложных заголовков, то для них в QDataSet я добавил
QList указателей на поля Fields - это поля из таблицы БД.
и добавил
QList колумнов Columns это часть указателей Fields, которые надо показывать во вьюхах, но порядок у них там другой.

и их визуальные свойства
    QString p_title;
    int p_width;
    int p_displayScale;
    Qt::Orientation p_orientation;
    QString p_typeFormat;
    char p_format;
    bool p_hidden;   
    bool p_readOnly;
    bool p_checkBox;
    QString p_trueValue;
    QString p_falseValue;
    QStringList p_pickList;
    QColor p_color;
    int p_columnIndex;

Когда вьюхи обращаются к модели к функции data() через logicalIndex, я им подсовываю нужные свойства в зависимости от Роли.

Структура сложного заголовка хранится в QDataHeaderView: public QHeaderView в собственной модели headerModel = new QStandardItemModel(); и строится она на основании свойства p_title списка Columns.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 14, 2008, 17:00
cпасибо большое за описание


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 15, 2008, 18:15
продолжаю раскуривать класс :)
ну никак не выходит :(

попытался возобновить структуру классов таким образом:

Код:
class QSocketDataSet : public QAbstractItemModel
{
   Q_OBJECT
   QSocketDataSet( QObject * parent = 0 );
   ~QSocketDataSet();
private:
public:
   QList<Columns*> m_vColumns;
};

class Columns
{
public:
   Columns(int width, bool visibility, Qt::Orientation orientation, int columnIndex);
   ~Columns();

   int width() { return m_iWidth; }
   bool hidden() { return m_bHidden; }
   QString title() { return m_sTitle; }
   Qt::Orientation orientation() { return m_Orientation; }
protected:
private:
   QString m_sTitle;
   int m_iWidth;
   Qt::Orientation m_Orientation;
   bool m_bHidden;   
   int m_iColumnIndex;

};

Если правильно понял, то класс Columns - это класс с колонками самого верхнего уровня. Так ли это?

сделал такие конструкторы:

Код:
QSocketDataSet::QSocketDataSet( QObject * parent)
: QAbstractItemModel(parent)
{
Columns* section1 = new Columns( 100, false, Qt::Horizontal, 0);
m_vColumns.push_back( section1 );
}

Columns::Columns(int width, bool visibility, Qt::Orientation orientation, int columnIndex)
{
m_iWidth = width;
m_bHidden = visibility;
m_pOrientation = orientation;
m_sTitle = "parent column|child column1|child column2";
m_iColumnIndex = columnIndex;
}

соответствтенно в реализации QDataHeaderView заменил

Код:
cds->Fields->Columns[i]->...
на
Код:
cds->Columns[i]->

в методе paintSection()

Код:
QField *fld = cds->Fields->Columns[ logicalIndex ];
поменял на
Код:
Сolumns *fld = cds->Columns[ logicalIndex ];

единственное, что непонятно - в методе headerData содержится строчка

Код:
v_list.insert(0,  cds->Fields->Columns[ Section ]->fieldName());
что же возвращает метод fieldName, если title() возвращает m_sTitle?

и еще: никак не пойму, где используется свойство m_iColumnIndex?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 16, 2008, 08:02
Цитировать
единственное, что непонятно - в методе headerData содержится строчка

Код:
Код:
v_list.insert(0,  cds->Fields->Columns[ Section ]->fieldName());
что же возвращает метод fieldName, если title() возвращает m_sTitle?


Код:
	
   QVariantList v_list;
           if(orientation == Qt::Horizontal) // Если горизонтальный
{ // Вытащить инфу о хидере для Section, которая строится по title
getTreeItems(headerModel->invisibleRootItem(), &v_list, Section, &tmp_rows);
              if(v_list.count() == 0) // Если инфы о хидере по title нет, значит title забыли задать, либо НЕ посчитали нужным
         // Впихнуть туда SQL имя поля из БД
                    v_list.insert(0,  cds->Fields->Columns[ Section ]->fieldName());

return v_list;
}


Цитировать
и еще: никак не пойму, где используется свойство m_iColumnIndex?

Код:
class QField{
 ...
    QString p_title;
    int p_width;
    int p_displayScale;
    Qt::Orientation p_orientation;
    QString p_typeFormat;
    char p_format;
    bool p_hidden;   
    bool p_readOnly;
    bool p_checkBox;
    QString p_trueValue;
    QString p_falseValue;
    QStringList p_pickList;
    QColor p_color;
    int p_columnIndex;
...
}

class QFields {
...
   QList<QField*> Fields;
   QList<QField*> Columns;
...
}

class QDataSet: public QAbstractTableModel{
...
  QFields *Fields;
...
}
class QSocketDataSet: public QDataSet{
...
  // Порт, IP Сервера и т.д.
...
}
index поля в SQL таблице может быть 7, а во вьюхе оно будет, например, во 2-ой колонке.
для этого и нужен p_columnIndex, чтобы знать где оно отображается.
Иначе пришлось бы ещё заюзывать промежуточную Poxy Model.



Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 16, 2008, 09:31
я конечно извиняюсь за свою сообразительность, но нигде не могу найти метода, который бы использовал int p_columnIndex;
подозреваю, что это paintSection(), но как последний узнает об p_columnIndex ???

или, может, p_columnIndex не нужен для построения  хэдера, который нужно создать так, как это предлагается в QString p_title; ?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 16, 2008, 09:57
p_columnIndex в визуальных компонентах вообще не используется.
У моих полей QField есть функция setValue(const QVariant & value) для того чтобы setData(...) модели не юзать.

Если я программно меняю значения полей типа:
while( ! dataSet->isEof() )
{
 ...
 myField->setValue("Бла-бла");
 dataSet->Next();
}

То ни одна вьюха об этом не узнает.

Для этого внутри функции setValue() я проверяю columnIndex, если он больше нуля, то поле входит в состав Columns и я вызываю setData() модели со своей личной Ролью только для того, чтобы там всего лишь выдать emit dataChanged(...);   
Все заинтересованные вьюхи, таблички, списки, комбобоксы сразу отобразят изменения.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 16, 2008, 10:58
спасибо за терпение :)
вопрос конечно же не по теме, но указатель cds не может взять модель вот в этом месте:

Код:
void QDataHeaderView::slotCountChanged ( int oldCount, int newCount )
{
   QSocketDataSet *cds = qobject_cast<QSocketDataSet*>(model());       
   if(cds == NULL) return;
...
}

сds == NULL, а почему, если

Код:
class QSocketDataSet : public QAbstractItemModel
{
   Q_OBJECT
   QSocketDataSet( QObject * parent = 0 );
   ~QSocketDataSet();
private:
   QList<Field*> Columns;
};


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 16, 2008, 11:22
у вьюхи функция model() вовсе не обязательно может вернуть то, что потом можно привести к типу QSocketDataSet. 
Всё, что не QSocketDataSet меня не интересует, поэтому return;
Или что-то не так?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 16, 2008, 11:39
что-то не так:
сигнал sectionCountChanged(int, int) имитируется, но при выполнении
Код:
QDataHeaderView::slotCountChanged ( int oldCount, int newCount )
слота, почему-то указатель cds - нулевой, соответственно return;
только почему ???


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Zmeishe от Апрель 16, 2008, 11:53
Если у QDataHeaderView модель будет какая угодно, но не QSocketDataSet,
конструкция
QSocketDataSet *cds = qobject_cast<QSocketDataSet*>(model());       
вернёт NULL или НЕ NULL ?
Я хочу подстраховаться и с другими моделями не работать. Кому нужны другие модели, пусть сам учитывает тонкости своих моделей. Я НЕ ставил себе цель рисовать эти заголовки в общем виде для любых моделей. Меня моя модель вполне устраивает.


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: Karl-Philipp от Апрель 16, 2008, 13:00
получается модель QSocketDataSet нужно установить для QDataHeaderView? Если да, то как это сделать?

Не ругайте меня сильно, я хочу разобраться, в Qt - новичек, а заголовки иерархические очень нужны  :-[


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: ритт от Апрель 16, 2008, 13:09
в первую очередь читай ассистант...про qobject_cat, про setModel и т.д.

сделаешь setModel на таблвьюхе, она сама установит эту модель в хидеры (если никто вьюху предварительно не насиловал)

и зачем новичку в программировании в край нужен многоуровневый хидер?


Название: Re: Иерархические заголовки таблиц QTableWidget/QTableView...
Отправлено: lit-uriy от Апрель 16, 2008, 14:24
и зачем новичку в программировании в край нужен многоуровневый хидер?
а это от уровня програмирования ни как не зависит, это пользовательский интерфейс, и желания уровня пользователя, а не програмера, да и потом такие заголовки очень наглядны.