Russian Qt Forum
Август 07, 2020, 16:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Иерархические заголовки таблиц QTableWidget/QTableView...  (Прочитано 29855 раз)
ритт
Гость
« Ответ #15 : Декабрь 27, 2007, 00:38 »

кстати, это так и называется - "спан", а не "Иерархические заголовки"
Записан
Cyrax
Гость
« Ответ #16 : Декабрь 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'ы, как минимум, двуслойные...
Записан
ритт
Гость
« Ответ #17 : Декабрь 27, 2007, 13:39 »

Это у кого такой метод ?  Ни у QTableView, ни у QAbstractItemView такого нет...
QTableView, начиная с 4.2
какая версия кутей?

Мне нужны именно иерархические заголовки, которые, собственно, можно реализовать через спан соседних ячеек. Только для этого потребуются многослойные header'ы, как минимум, двуслойные...
примерно то, что я нарисовал на пред.странице?
Записан
Cyrax
Гость
« Ответ #18 : Декабрь 27, 2007, 13:45 »

Цитировать
какая версия кутей?
4.1.4

Цитировать
примерно то, что я нарисовал на пред.странице?
Именно. Спан разве именно это не делает ?
Записан
Cyrax
Гость
« Ответ #19 : Декабрь 28, 2007, 19:42 »

Может, кто-нибудь проверит, как работает span в Qt 4.2 и выше.
Интересует в первую очередь следующее:
Цитировать
+---------------------------------+
|               заголовок                  |
+---------------+-----------------+
|  заголовок.     |    заголовок      |
+---------------+-----------------+
|  данные(0,0)   |    данные(0,1)    |
+---------------+-----------------+
Такое можно сделать с помощью span'а (объединение 2-х верхних ячеек + надпись на области обоих ячеек, как будто это одна ячейка) ?
Записан
Cyrax
Гость
« Ответ #20 : Январь 10, 2008, 23:57 »

Если воспользоваться span'ами, то нужно сделать QHeaderView в составе QTableView многоэтажным. Тогда вопрос будет решён. Останется только интерфейс своего TableView'а удобно оформить.
Если span'ы не использовать, то будет посложнее...

Ещё придётся каким-то образом "уложить" всю информацию, необходимую для заголовков в сигнатуру метода QTableView::headerData(), где секция задаётся одним целым числом. Одним целым числом задать фрагмент иерархического заголовка...
Можно, если формировать его, скажем, складывая по 1000 для каждого следующего уровня.
« Последнее редактирование: Январь 14, 2008, 09:36 от Cyrax » Записан
Karl-Philipp
Гость
« Ответ #21 : Апрель 02, 2008, 18:22 »

Если воспользоваться span'ами, то нужно сделать QHeaderView в составе QTableView многоэтажным. Тогда вопрос будет решён.

Подскажите, пожалуйста, как можно сделать QHeaderView многоэтажным?
Записан
Zmeishe
Гость
« Ответ #22 : Апрель 03, 2008, 15:15 »

Типа этого ? Три месяца мучался.
« Последнее редактирование: Апрель 03, 2008, 15:16 от Zmeishe » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5806


Жаждущий знаний


Просмотр профиля WWW
« Ответ #23 : Апрель 03, 2008, 15:49 »

Вот теперь расскажи всем как ты это намучил. Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Karl-Philipp
Гость
« Ответ #24 : Апрель 04, 2008, 18:38 »

Типа этого ? Три месяца мучался.
Да, именно это Улыбающийся. Очень хотелось бы услышать, как это было сделано?
« Последнее редактирование: Апрель 04, 2008, 18:41 от terlan » Записан
Zmeishe
Гость
« Ответ #25 : Апрель 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
{
 ...
}

Думаю моя стратегия ясна - остальное по ходу пьесы.
Записан
ритт
Гость
« Ответ #26 : Апрель 05, 2008, 13:08 »

думаю, многие были бы благодарны, если б ты выложил рабочий код

и вообще можно было бы сделать публичный или закрытый раздел для обмена компонентами, на которые не накладывается коммерческая лицензия
Записан
Zmeishe
Гость
« Ответ #27 : Апрель 05, 2008, 13:18 »

думаю, многие были бы благодарны, если б ты выложил рабочий код

и вообще можно было бы сделать публичный или закрытый раздел для обмена компонентами, на которые не накладывается коммерческая лицензия
Для этого код нужно очистить он моей конкретной задачи, т.е. сделать выжимку из него.
Записан
ритт
Гость
« Ответ #28 : Апрель 05, 2008, 14:21 »

ну, будет время - милости просим

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

Сообщений: 544



Просмотр профиля WWW
« Ответ #29 : Апрель 09, 2008, 09:40 »

http://trolltech.com/developer/knowledgebase/faq.2007-09-26.7736043425/
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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