Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: carrygun от Ноябрь 27, 2012, 07:45



Название: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: 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);
На картинке показано как это выглядит.


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: GreatSnake от Ноябрь 27, 2012, 11:50
А чем не устроил HeaderView для иерархических заголовков (http://www.prog.org.ru/index.php?topic=9143.msg51741#msg51741)?


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: carrygun от Ноябрь 27, 2012, 12:22
А чем не устроил HeaderView для иерархических заголовков (http://www.prog.org.ru/index.php?topic=9143.msg51741#msg51741)?
Все хорошо, но как я не искал по форуму, то на эту тему не натыкался, только 3 очень старые темы (~2007 год) находились.
Ну ничего, возможно, мое решение попроще будет и пригодится кому.


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: kolob от Декабрь 27, 2012, 12:18
carrygun в вашем классе реализована функция окрашивать каждый элемент заголовка в свой цвет?


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: carrygun от Декабрь 28, 2012, 05:28
carrygun в вашем классе реализована функция окрашивать каждый элемент заголовка в свой цвет?

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


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: carrygun от Декабрь 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));
Результат во вложении.


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: carrygun от Декабрь 28, 2012, 06:59
Есть такой интересный момент. Если используется системная рисовалка (например обычный синий стиль XP), то цвета заголовков игнорируются. Вроде бы и не баг, а фича, но хочется рисовать во всех стилях как мне надо.
Ктонибудь может подсказать куда копать?


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: GreatSnake от Декабрь 28, 2012, 10:24
Ну дык, коли используется тема, то её цвета и используются)


Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: carrygun от Декабрь 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));



Название: Re: Многоуровневые (иерархические заголовки) для таблиц
Отправлено: Авварон от Декабрь 29, 2012, 13:03
Можно, поверх системной отрисовки надо залить рект нужным цветом с прозрачностью. Выглядит не так ярко, как хочется, но вполне приемлемо.


Название: Re: Многоуровневые (иерархические заголовк
Отправлено: kolob от Май 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);
}

Надо будет еще смену шрифтов сделать.
-----------------------------------------------------------------------------------
Решил проблему, надо было немного класс переписать.