Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: v6y от Февраль 04, 2010, 14:06



Название: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 04, 2010, 14:06
Наваял сегодня с утра. Без использования дополнительных моделей.  Может кому пригодится...



Название: Re: Опять многосточные QHeaderView...
Отправлено: panAlexey от Февраль 04, 2010, 14:44
Наваял сегодня с утра. Без использования дополнительных моделей.  Может кому пригодится...
А футтеры слабо сделать? :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 04, 2010, 18:07
А футтеры слабо сделать? :)

Какие футтеры?


Название: Re: Опять многосточные QHeaderView...
Отправлено: developer от Февраль 04, 2010, 18:54
Я так понимаю - ето те же хедера только внизу таблицы


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 05, 2010, 07:55
Я так понимаю - ето те же хедера только внизу таблицы
Пока слабо, точнее лениво.


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 05, 2010, 16:58
Я так понимаю - ето те же хедера только внизу таблицы
Qt 4.5.2
Нацарапал тут очень-очень черновой вариант футеров. Скорее даже эмуляцию (через QVBoxLayout), а не сами футеры.


Название: Re: Опять многосточные QHeaderView...
Отправлено: developer от Февраль 06, 2010, 12:58
Смотрел код, мне понравилось. Конечно надо еще отшлифовать


Название: Re: Опять многосточные QHeaderView...
Отправлено: panAlexey от Февраль 06, 2010, 13:32
Скрины не помешают.


Название: Re: Опять многосточные QHeaderView...
Отправлено: Karl-Philipp от Февраль 06, 2010, 14:28
Подскажите, пожалуйста, почему не могу собрать проект?
Как ни переподлключал заголовки - не получается.
Ошибки во вложении.


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 06, 2010, 17:37
Подскажите, пожалуйста, почему не могу собрать проект?
Как ни переподлключал заголовки - не получается.
Ошибки во вложении.

У меня gcc под Линукс и Винду откомпилил нормально. Возможно слишком часто включен GtGui. Поробуйте убрать #include <QtGui> из main.cpp и mheader.h

Слегка модифицировал код, чтобы горизонтальный скрол бар находился под футером. Во вложении скрин того что получилось


Название: Re: Опять многосточные QHeaderView...
Отправлено: panAlexey от Февраль 07, 2010, 13:57
Классно. Очень наглядно :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 07, 2010, 14:40
Классно. Очень наглядно :)
Вы главное меня больше на слабо не берите  ;D

К сожалению прорисовку заголовков придется оптимизировать, а то притормаживает иногда. Собственно это не сложно, но кода чуть-чуть по больше будет.


Название: Re: Опять многосточные QHeaderView...
Отправлено: panAlexey от Февраль 07, 2010, 18:50
Классно. Очень наглядно :)
Вы главное меня больше на слабо не берите  ;D
Мой знакомый на слабо на 3 ночи модуль Intelisence для 1Сv77 на VBScript налабал.
Ничего страшного, теперь десятки тысяч человек пользуются.


Название: Re: Опять многосточные QHeaderView...
Отправлено: c00ker от Февраль 08, 2010, 17:28
а чем HierarchicalHeaderView не устроил? Там правда футеров нет.

http://www.prog.org.ru/topic_9143_0.html
http://qt-apps.org/content/show.php/HierarchicalHeaderView?content=103154


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Февраль 08, 2010, 19:42
а чем HierarchicalHeaderView не устроил? Там правда футеров нет.
У меня их тоже изначально не было  :)
Плюс у меня нет возможности вращения текста (хотя нетрудно сделать) и работаю только с горизонтальными заголовками (хотя вертикальные сделать тоже не проблема, только пока ни разу не понадобилось).

Не устроило главным образом, то что нужно создавать модель. Кроме того, не знаю исправили ли их сейчас, но раньше была пара мелких багов:
1) При установке
      hv->setHighlightSections (true);
      hv->setClickable(true);
не совсем корректно подсвечивались секции
2) При длинном имени верхней секции не всегда правильно подсчитывался размер
см. вложение


Название: Re: Опять многосточные QHeaderView...
Отправлено: SibViking от Май 23, 2010, 15:25
Спасибо, очень помогло  ;D - я уж думал голову ломать и собственный вариант многострочной таблицы ваять


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Май 24, 2010, 09:51
Спасибо, очень помогло  ;D - я уж думал голову ломать и собственный вариант многострочной таблицы ваять
Рад, что хоть кому-то помогло :)

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


Название: Re: Опять многосточные QHeaderView...
Отправлено: VozaMFC от Май 28, 2010, 14:23
ничего исходник...обязательно попробуем  :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: SibViking от Июнь 04, 2010, 12:01
Рад, что хоть кому-то помогло :)

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


А можно подобную вещицу под модель сделать?


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 12:52
ест проц на 95% :(

а почему лицензия только GPL?


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 12:59
А можно подобную вещицу под модель сделать?
В смысле?


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 13:05
ест проц на 95% :(

У меня последний вариант  ест проц ровно также как и при использовании QTableView с обычными QHeaderView - ~ 75% (при активном скролинге)

Цитировать
а почему лицензия только GPL?
А в чем проблема?




Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 14:09
ест проц на 95% :(

У меня последний вариант  ест проц ровно также как и при использовании QTableView с обычными QHeaderView - ~ 75% (при активном скролинге)
в том то и дело что без скролинга, просто открытое окно.
linux, qt 4.6.2
Цитировать
Цитировать
а почему лицензия только GPL?
А в чем проблема?
просто сама qt распространяется еще и под LGPL...
в закрытой разработке придется изобретать велосипед, а про Ваш код забыть...
ну это целиком Ваше дело...
Цитировать



Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 14:15
о... что бы воспроизвести баг нужно уменьшить размер окна примерно в 2 раза...
на весь экран все ок, вроде...


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 15:18
о... что бы воспроизвести баг нужно уменьшить размер окна примерно в 2 раза...
на весь экран все ок, вроде...
Не могу воспроизвести. Под Линуксом у меня вообще больше 14% ЦПУ не грузится. Проверил на 4.5.2, 4.6.1 и 4.6.2.

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


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 15:46
о... что бы воспроизвести баг нужно уменьшить размер окна примерно в 2 раза...
на весь экран все ок, вроде...
Не могу воспроизвести. Под Линуксом у меня вообще больше 14% ЦПУ не грузится. Проверил на 4.5.2, 4.6.1 и 4.6.2.

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


даже если уменьшить окно до совсем небольших размеров?


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 16:33
даже если уменьшить окно до совсем небольших размеров?

Чем меньше окно тем меньше использование ЦПУ. Без скролинга ЦПУ = 0
Вы точно пробовали последнюю версию?


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 16:40
даже если уменьшить окно до совсем небольших размеров?

Чем меньше окно тем меньше использование ЦПУ. Без скролинга ЦПУ = 0
Вы точно пробовали последнюю версию?

странно...
использую последнюю выложенную Вами.
если убрать HMultiHeader и начать играться с размером - все ок... но как только HMultiHeader выходит за пределы отрисовки, начинает жрать цпу...


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 16:52
странно...
использую последнюю выложенную Вами.
если убрать HMultiHeader и начать играться с размером - все ок... но как только HMultiHeader выходит за пределы отрисовки, начинает жрать цпу...

Действительно странно, проверил на 2 Линуксах (Debian 4.0 и 5.0, Интеловская графическая карточка), и на одной Винде XP  (Dell 500) - разницы в поведении c QHeaderView  не заметил.

Может кто еще, кому не лень, поверит?


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 16:54
а что делает код:
  if (spans) {
    QRect newrect;
    setRect(event->rect(),newrect);
    if (event->rect()!=newrect)  setDirtyRegion(newrect); //adjust rect for spanned headers
  }

из HMultiHeader::paintEvent ?

если его убрать то с ЦПУ все ОК...


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 16:58
а что делает код:
  if (spans) {
    QRect newrect;
    setRect(event->rect(),newrect);
    if (event->rect()!=newrect)  setDirtyRegion(newrect); //adjust rect for spanned headers
  }

из HMultiHeader::paintEvent ?

если его убрать то с ЦПУ все ОК...

Ну я же говорю - Вы используете старую версию.  Загрузите на второй странице вложение из второго сообщения


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 17:00
тьфу блин! точно не последняя версия.... пардон!


Название: Re: Опять многосточные QHeaderView...
Отправлено: mkv от Июнь 04, 2010, 17:02
теперь хорошо работает :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 04, 2010, 17:04
теперь хорошо работает :)

Ну и слава Богу  :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: SibViking от Июнь 06, 2010, 04:10
В смысле?


Под QTableView, а в создаваемой пользовательской модели формировать заголовок, я просто одну версию многострочного заголовка использую для своего велосипеда http://www.prog.org.ru/index.php?topic=13717.msg89282#msg89282 - но что то у меня с ним глюки определенного рода появляются, хотелось бы и что то другое подобное попробовать


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 09:06
В смысле?


Под QTableView, а в создаваемой пользовательской модели формировать заголовок, я просто одну версию многострочного заголовка использую для своего велосипеда http://www.prog.org.ru/index.php?topic=13717.msg89282#msg89282 - но что то у меня с ним глюки определенного рода появляются, хотелось бы и что то другое подобное попробовать

Я возможно Вас не совсем правильно  понял, но в реальной жизни HMultiHeader используется как раз с QTableView и изначально  проектировался  независимым от моделей.  Делается model->setHeaderData, затем указывается как и какие столбцы объединять с помощью метода HMultiHeader::spanCols. Правда есть одно ограничение - вначале  указывается самый верхний уровень объединенных ячеек: spanCols(Text,0,5); spanCols(0,2) - сработает, spanCols(0,2); spanCols(0,5) - не сработает.

В выложенном примере QTableWidget используется только для простоты. QTableWidget::setHorizontalHeaderItem используется из-за особенностей QTableWidget. Хранить информацию об объединенных  ячейках в модели не хочу принципиально, так как в этом случае HMultiHeader будет пригоден только для определенного типа моделей.


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 11:10
А можно про "не сработает" поподробнее, а то у меня как раз какой-то загадочный баг :)
Рисую такой хедер, а spanCols(str,0,8) не срабатывает почему-то и получается ерунда.

P.S. Спасибо за виджет, он очень помог :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 11:25
А можно про "не сработает" поподробнее, а то у меня как раз какой-то загадочный баг :)
Рисую такой хедер, а spanCols(str,0,8) не срабатывает почему-то и получается ерунда.

После spanCols(0,8) ,  должно быть
 spanCols(0,2);spanCols(3,5);spanCols(6,8);

Ну а лучше покажите что делали и что хотели сделать.


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 11:29
я делаю иначе.
сначала разбиваю хедер на крупные заголовки: spanCols(0,8), spanCols(9,17), spanCols(18,26), потом разбиваю его на более мелкие: spanCols(0,2), spanCols(3,5),.. и так далее.


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 11:32
я делаю иначе.
сначала разбиваю хедер на крупные заголовки: spanCols(0,8), spanCols(9,17), spanCols(18,26), потом разбиваю его на более мелкие: spanCols(0,2), spanCols(3,5),.. и так далее.

В принципе правильно делаете. Соответствующий участок кода можете показать?


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 11:36
Вот: http://pastebin.com/ZtqviCCz (http://pastebin.com/ZtqviCCz). не обращайте внимания на стиль кода, он проходил полуторадневный дебаг :)
FieldList это элемент двусвязного списка, в котором в QStringList хранятся названия.


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 11:42
Вот: http://pastebin.com/ZtqviCCz (http://pastebin.com/ZtqviCCz). не обращайте внимания на стиль кода, он проходил полуторадневный дебаг :)
FieldList это элемент двусвязного списка, в котором в QStringList хранятся названия.


А в "лоб"  все это делать пробовали?


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 12:13
Сейчас попробовал: http://pastebin.com/Mv80gPxF (http://pastebin.com/Mv80gPxF)
output: Fail! start 0 stop 8





Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 12:28
Сейчас попробовал: http://pastebin.com/Mv80gPxF (http://pastebin.com/Mv80gPxF)
output: Fail! start 0 stop 8

Странно, у меня все ОК.

Весь код можете выложить?


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 12:29
Магия! можете кинуть код целиком?
ну еще может быть у нас версии HMultiHeader разные.


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 12:31
Магия! можете кинуть код целиком?
ну еще может быть у нас версии HMultiHeader разные.
Измененный main.cpp


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 13:01
Ну ведь это магия. В Qt Creator этот код работает, в MS VS2008 по-прежнему баг. может 10ю поставить в надежде, что все исправится? :)


Название: Re: Опять многосточные QHeaderView...
Отправлено: ragzovskii от Июнь 06, 2010, 14:50
Проблему решил с помощью костыля: перенес в public mutable colspan* spans и при генерации заголовка делал multiHeader->spans = NULL. костыль работает для 4 записей, а дальше таблица, один фиг, не читабельна :)

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


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Июнь 06, 2010, 15:42
Проблему решил с помощью костыля: перенес в public mutable colspan* spans и при генерации заголовка делал multiHeader->spans = NULL. костыль работает для 4 записей, а дальше таблица, один фиг, не читабельна :)

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

Я не ипсользую Visual Studio, а в связке qmake, g++, make  все работает нормально и под Windows и под Linux. Попробуйте под отладчиком посмотреть почему такое неадекватное поведение в Visual Studio.

В конструкторе spans и так устанавливается в NULL. Для переинициализации spans лучше использовать метод freeSpans, что-то типа:
public:
 freeAllSpans() { freesSpans(spans); level=1;}
 - он все удалит и обнулит.  

Получить названия объединенных столбцов нетрудно (getTopSpan(start) получает самый верхний span, далее обход по дереву, условие останова - start и stop должны совпадать с соотвествующими переданными параметрами), но мне эта возможность не нужна, а изменить текст  объединенных столбцов  можно и в текущей версии - при вызове spanCols(Text,start,stop) если span существует, то текст заменится на новый Text.



Название: Re: Опять многосточные QHeaderView...
Отправлено: Prm от Октябрь 12, 2010, 10:03
Заюзал предложенное решение, понравилось. В процессе эксперимента с компонентом нашел баг. Использовал QTableView. В случае выделения всей строки, в хедере таблицы шрифт подсекций жирный, а у обобщенного заголовка обычный.
Код:
    table->setSelectionMode(QAbstractItemView::SingleSelection);
    table->setSelectionBehavior(QAbstractItemView::SelectRows);


Название: Re: Опять многосточные QHeaderView...
Отправлено: v6y от Октябрь 12, 2010, 13:16
Заюзал предложенное решение, понравилось. В процессе эксперимента с компонентом нашел баг. Использовал QTableView. В случае выделения всей строки, в хедере таблицы шрифт подсекций жирный, а у обобщенного заголовка обычный.
Код:
    table->setSelectionMode(QAbstractItemView::SingleSelection);
    table->setSelectionBehavior(QAbstractItemView::SelectRows);

Это не баг - это фича  ;D
Можно воспользоваться методом QHeaderView::setHighlightSections, тогда вобще подсвечиваться не будет, либо  переписать  paintSection полностью - я от лени просто ограничиваюсь вызовом paintSection от QHeaderView


Название: Re: Опять многосточные QHeaderView...
Отправлено: Andrew Vladoff от Март 01, 2012, 08:51
Заметил, что если сжать таблицу до размера 5х5 см, то начинает грузить проц.
А как разукрасить поля в заголовке разными цветами?