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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Многоуровневые (иерархические заголовки) для таблиц  (Прочитано 9210 раз)
carrygun
Гость
« : Ноябрь 27, 2012, 07:45 »

В общем нужны они мне были и не раз, но как-то обходился. Сейчас же понадобились сильно и отвертеться не получилось. Поискав по форуму, готовых решений не нашел. Была единственная тема, которая направила меня в нужное русло, но там заголовок был привязан к какой-то конкретной своей модели, что не удобно (а еще и, возможно, с багами, по крайней мере я наткнулся на один, пока реализовывал).
Плюс данного класса в том, что его можно применить к любой модели, даже к стандартным виджетам:

Код:
    QGroupHeaderView *ghv = new QGroupHeaderView(Qt::Horizontal, treeWidget);
    treeWidget->setHeaderLabels(QStringList() << "test1" << "test2"
                                << "group|test3" << "group|test4" << "test5");
    treeWidget->setHeader(ghv);
На картинке показано как это выглядит.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 27, 2012, 11:50 »

А чем не устроил HeaderView для иерархических заголовков?
Записан

Qt 5.11/4.8.7 (X11/Win)
carrygun
Гость
« Ответ #2 : Ноябрь 27, 2012, 12:22 »

Все хорошо, но как я не искал по форуму, то на эту тему не натыкался, только 3 очень старые темы (~2007 год) находились.
Ну ничего, возможно, мое решение попроще будет и пригодится кому.
« Последнее редактирование: Ноябрь 27, 2012, 12:24 от carrygun » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #3 : Декабрь 27, 2012, 12:18 »

carrygun в вашем классе реализована функция окрашивать каждый элемент заголовка в свой цвет?
Записан

Qt 5.11.0, Win, MinGW
carrygun
Гость
« Ответ #4 : Декабрь 28, 2012, 05:28 »

carrygun в вашем классе реализована функция окрашивать каждый элемент заголовка в свой цвет?

Нет, мне по работе нужны были такие заголовки, просто с группировкой, а на нужную тему я на форуме не наткнулся. Их даже вертикальными делать нельзя, я жестко к горизонтали привязался, хотя исправлять не много.
Ну и желающие могут цвета сделать (а может и я сам, если комуто надо очень).
Записан
carrygun
Гость
« Ответ #5 : Декабрь 28, 2012, 06:41 »

Вот сделал метод для смены цвета секции:

Код:
setSectionColor(int section, int row, const QColor &color)

Использование:
Код:
    QGroupHeaderView *ghv = new QGroupHeaderView(Qt::Horizontal, treeWidget);
    treeWidget->setHeaderLabels(QStringList() << "test1" << "test2"
                                << "group|test3" << "group|test4" << "test5");
    treeWidget->setHeader(ghv);
    ghv->setSectionColor(2, 0, QColor(128, 128, 255));
    ghv->setSectionColor(2, 1, QColor(255, 160, 115));
    ghv->setSectionColor(3, 1, QColor(10, 230, 250));
    ghv->setSectionColor(0, 0, QColor(40, 215, 120));
Результат во вложении.
Записан
carrygun
Гость
« Ответ #6 : Декабрь 28, 2012, 06:59 »

Есть такой интересный момент. Если используется системная рисовалка (например обычный синий стиль XP), то цвета заголовков игнорируются. Вроде бы и не баг, а фича, но хочется рисовать во всех стилях как мне надо.
Ктонибудь может подсказать куда копать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Декабрь 28, 2012, 10:24 »

Ну дык, коли используется тема, то её цвета и используются)
Записан

Qt 5.11/4.8.7 (X11/Win)
carrygun
Гость
« Ответ #8 : Декабрь 28, 2012, 11:16 »

Ну дык, коли используется тема, то её цвета и используются)

Просто я встречал кнопки которые имели другой фон, но стиль не меняли, даже на старой фоксе под вин7. Просто стало интересно, можно ли адекватно сделать? Понятно что можно все рисовать самому, но это как минимум сложно.

P.S. Допилил еще чутка, на большее пока времени и желания нет. Есть вертикальные хедеры. Есть косяки, такие как: текст рисуется все равно горизонтально, и в случае "QTable..." клики по хедерам работают не так, но как минимум их можно сигналом ловить.

Как всегда все в аттаче.

Код:
    QGroupHeaderView *vh, *hh;
    vh = new QGroupHeaderView(Qt::Vertical);
    hh = new QGroupHeaderView(Qt::Horizontal);
    tableWidget->setRowCount(5);
    tableWidget->setHorizontalHeader(hh);
    tableWidget->setVerticalHeader(vh);

    QStringList l = QStringList() << "test1" << "test2"
                                  << "group|test3" << "group|test4" << "test5";

    tableWidget->setHorizontalHeaderLabels(l);
    tableWidget->setVerticalHeaderLabels(l);

    hh->setSectionColor(2, 0, QColor(128, 128, 255));
    hh->setSectionColor(2, 1, QColor(255, 160, 115));
    hh->setSectionColor(3, 1, QColor(10, 230, 250));
    hh->setSectionColor(0, 0, QColor(40, 215, 120));

    vh->setSectionColor(2, 0, QColor(255, 128, 128));
    vh->setSectionColor(1, 0, QColor(255, 90, 170));
    vh->setSectionColor(4, 0, QColor(100, 30, 250));
    vh->setSectionColor(0, 0, QColor(220, 15, 80));

« Последнее редактирование: Декабрь 28, 2012, 11:42 от carrygun » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Декабрь 29, 2012, 13:03 »

Можно, поверх системной отрисовки надо залить рект нужным цветом с прозрачностью. Выглядит не так ярко, как хочется, но вполне приемлемо.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #10 : Май 08, 2013, 09:35 »

Подскажите как обновить иерархический заголовок заголовок (изменить количество колонок и название)?

-----------------------------------------------------------------------------------
В класс дописал функцию для смены цвета текста, если кому надо. Отрасовка уже реализована у carrygun.
Кстати спасибо ему за этот класс, мне очень пригодился.
Цитировать
void GroupHeaderView::setTextSectionColor(int section, int row, const QColor &color)
{
     if (section > count() -1 || row > rowCount - 1)
          return;
     headerMatrix[section][row].palette.setColor(QPalette::ButtonText, color);
}

Надо будет еще смену шрифтов сделать.
-----------------------------------------------------------------------------------
Решил проблему, надо было немного класс переписать.
« Последнее редактирование: Май 08, 2013, 13:49 от kolob » Записан

Qt 5.11.0, Win, MinGW
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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