Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: Barmaglodd от Апрель 09, 2009, 08:13



Название: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 09, 2009, 08:13
Наследник от QHeaderView для построения многоуровневых/иерархических заголовков, предназначен для горизонтальных заголовков. Структура описывается отдельной моделью. Возможно создание ячеек с повёрнутым на 90 градусов текстом.
http://qt-apps.org/content/show.php?content=103154 (http://qt-apps.org/content/show.php?content=103154)


Название: Re: HeaderView для иерархических заголовков
Отправлено: BaltikS от Апрель 09, 2009, 10:10
Конечно всё хорошо. И скриншот неплохой. Но неплохо было бы иметь компилябельный пример использования!


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 09, 2009, 11:50
Пример :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 13:41
hw_example/hierarchicalheaderview.cpp:168: ошибка: не найден метод для преобразования в ‘(QModelIndexList) (const QModelIndex&)’  :(



Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 09, 2009, 13:56
Я собирал только с VS2005, компилятор смог отличить имя переменной от имени метода, хотя, конечно, это мой косяк. Исправленная версия в шапке.


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 14:08
Это мы уже подправили  :)

Вот ещё предупреждения:

1) hw_example/main.cpp:24: предупреждение: параметр ‘parent’ не используется
2) hw_example/main.cpp:29: предупреждение: параметр ‘parent’ не используется
3) hw_example/main.cpp:34: предупреждение: параметр ‘index’ не используется

И ещё мне пришлось подправить следующее:

#include <QtCore/QAbstractTableModel>
#include <QtGui/QStandardItemModel>

("/" вместо "\")

А так всё работает  :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 09, 2009, 14:20
Это тоже почистил. Заодно убрал из заголовочного файла ненужное объявление QStandardItemModel. Архив в шапке.


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 14:37
Чудненько  :)

Ещё один вопрос:
Цвет шрифта - это такой дизайнерский ход?



Название: Re: HeaderView для иерархических заголовков
Отправлено: Rcus от Апрель 09, 2009, 14:44
кислород же :) интересно еще потестировать в цветовой схеме Obsidian Coast (с инверсными цветовыми схемами несоответствия пар цветов еще более заметны)


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 15:04
Да, кислород  :)



Название: Re: HeaderView для иерархических заголовков
Отправлено: Rcus от Апрель 09, 2009, 15:36
хм, дома проверил на Oxygen - Obsidian Coast


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 15:56
Думаю, в таких ситуациях логично трясти автора  ;) (Barmaglodd)



Название: Re: HeaderView для иерархических заголовков
Отправлено: BaltikS от Апрель 09, 2009, 17:52
Автора трясти не надо... Ему можно сделать лишь предложение на улучшение. То что он сделал - молодец! Решение частых вопросов на форуме. А варнинги в тестовом примере - не столь принципиально. Однозначно 5.


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 09, 2009, 18:17
Автора трясти не надо...
Не будем  :) (это уж так, любя... ;D)

То что он сделал - молодец! Решение частых вопросов на форуме. А варнинги в тестовом примере - не столь принципиально. Однозначно 5.

Ну тут никто не спорит: то что сделал Barmaglodd, вещь реально нужная  8)
А чтоб это было Однозначно на 5, можно и потрясти  (автора конечно)  ;)



Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 10, 2009, 05:46
А можно скриншот обычного заголовка таблицы и таблицы с моим заголовком, но не пустой, а с несколькими строками? У меня вся разработка под виндовсом, а дома KDE3 (но даже на нём я не тестировал).


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rcus от Апрель 10, 2009, 06:44
На работе нормальной KDE4 нет, надеюсь виндовая поможет


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 10, 2009, 07:42
Немного изменил отрисовку заголовка, если это не поможет, то придётся kde4 ставить. Архив в шапке.


Название: Re: HeaderView для иерархических заголовков
Отправлено: spirit от Апрель 10, 2009, 12:17
@Barmaglodd, запости сюда (http://www.qtcentre.org/forum/f-qt-programming-2/t-how-to-set-two-rows-in-a-table-view-horizontal-header-20144.html) свой хеадер :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: m_ax от Апрель 11, 2009, 00:02
Ну теперь вроде всё нормально  :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 13, 2009, 13:44
Добавил возможность повернуть текст в ячейке.


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 20, 2009, 07:21
Исходники переехали на Qt-apps.org. Поправил отображение подсвеченных ячеек. Размер ячейки теперь учитывает данные, возвращаемые по SizeHintRole.


Название: Re: HeaderView для иерархических заголовков
Отправлено: migel от Апрель 20, 2009, 16:29
А можно ли в заголoвки внедрить QWidget, например QLineEdit, QComboBox?


Название: Re: HeaderView для иерархических заголовков
Отправлено: lit-uriy от Апрель 20, 2009, 17:01
>>Исходники переехали на Qt-apps.org.
тыб линку хоть дал, чтоль.


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Апрель 21, 2009, 07:32
А можно ли в заголoвки внедрить QWidget, например QLineEdit, QComboBox?
Нет. Я уже писал в твоей теме, что проще сделать 2 QTableView: один для заголовка, другой для данных.

@lit-uriy Ссылка в первом посте темы.


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 24, 2009, 10:01
1)Эта тема очень важна, покрывает пробел в qt.
2) отчеты со сложными заголовками (да и с простыми) наполняются в основном из БД, поэтому было бы здорово иметь пример работы по заполнению таблицы из БД.


Название: Re: HeaderView для иерархических заголовков
Отправлено: ритт от Май 24, 2009, 10:23
2) и какое отношение вьюха с иерархическими заголовками имеет к заполнению модели данными из бд?
у нас там справа вверху есть инпут "поиск" - пользуйся на здоровье!


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 24, 2009, 11:17
я так понимаю, что вьюха с иерарх заголовками интересна не сама по себе, а присовокупившись к источнику данных. Думаю, что особенно новичкам пример подключения модели с данными из БД был бы просто спасением. В реальной жизни нужны именно отчеты, а не вьюхи


Название: Re: HeaderView для иерархических заголовков
Отправлено: ритт от Май 24, 2009, 15:05
а как будешь печатать ВЬЮХУ?:)


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 24, 2009, 15:30
дык, это второй вопрос, вот бы знать ответ!  ;D


Название: Re: HeaderView для иерархических заголовков
Отправлено: ритт от Май 24, 2009, 16:51
не проблема...вот ответ: распечатать вьюху нельзя :) /* вариант с грабом виджета в пиксмап - вообще не вариант */
твои друзья: ХыТыМылы, ncreport, exaro и т.п.


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 24, 2009, 17:09
Беда! :o


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Май 25, 2009, 05:23
2) отчеты со сложными заголовками (да и с простыми) наполняются в основном из БД, поэтому было бы здорово иметь пример работы по заполнению таблицы из БД.
Такого примера нет и никогда не будет (во всяком случае, я его писать не буду). Я не знаю как вы эти заголовки в базе храните, не знаю какую СУБД используете и как доступ к базе организуете.

@Константин. Да ладно, тролли сами выкладывали в блоге пример с "распечаткой", где таблица тупо в картинку рендерилась. ;)


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 26, 2009, 20:23
заголовки ни при чем, их хоть в xml можно (лучше) хранить, хоть в тексте программы при написании конкретного отчета. Вопрос в наиболее общей форме таков - как подцепить , модель данных QSqlTableModel, QSqlRelationalTableModel и прочие к этой вьюхе. Без ответа на этот вопрос работа особой ценности не имеет. А потребность в решении вопроса возникает у каждого, кто пишет реальные программы.


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rikland от Май 26, 2009, 23:03
Вопрос в наиболее общей форме таков - как подцепить , модель данных QSqlTableModel, QSqlRelationalTableModel и прочие к этой вьюхе.

phonon, а не разъяснишь ли свой вопрос? Не очень понимаю - в чем проблема: у меня идет отображение данных QSqlQueryModel'и + красивый заголовок. Все нормально.

Хочу сказать отдельное СПАСИБО автору Barmaglodd: заголовки потрясающие!  ;D


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Май 28, 2009, 07:07
Я сам не использую QSql(я использую otl+самописные модели), так что потребности в решении этого вопроса у меня лично не возникло.
Могу лишь предложить несколько вариантов.
1. Наследуемся от QSqlTableModel, и в методе data для HorizontalHeaderDataRole и VerticalHeaderDataRole возвращаем указатель на соответствующие модели заголовков. Откуда будут браться данные в этих моделях целиком зависит от вас.
2. Делаем наледника от QSortFilterProxyModel, подсовываем ему вашу QSqlTableModel, а в методе data возвращаем указатели на модели заголовков.
3. Можно попробовать сделать у QSqlTableModel setData с ролями HorizontalHeaderDataRole и VerticalHeaderDataRole и указателями на модели заголовков. Сам это не пробовал, скорее всего не сработает.
4. Можно попросить Rikland'а выложить кусок своего кода ;)

PS. XML вообще нужен в очень редких случаях, и лучше его использовать только, когда без него ну никак не обойтись, IMHO ;)

@Rikland Спасибо :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rikland от Май 28, 2009, 18:32
4. Можно попросить Rikland'а выложить кусок своего кода ;)
Ребят, да мне даже кода не жалко, тем более, что его там 5 строк. Просто кажется, что я вопроса не понимаю.  ???
Вот такой результат (см. картинку вложенную) что ли нужен?


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 28, 2009, 18:38
4. Можно попросить Rikland'а выложить кусок своего кода ;)
Ребят, да мне даже кода не жалко, тем более, что его там 5 строк. Просто кажется, что я вопроса не понимаю.  ???
Вот такой результат (см. картинку вложенную) что ли нужен?

Не доводите до смертоубийства, это то что нужно, дайте код и можете спать спокойно - одного человека вы точно осчастливите!!


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rikland от Май 28, 2009, 20:53
@phonon: ну примерно так...

Код:
ExampleModel *em = new ExampleModel(this);
HierarchicalHeaderView *hv = new HierarchicalHeaderView(Qt::Horizontal, ui->tableView);
hv->setModel(em);
ui->tableView->setHorizontalHeader(hv);
QSqlQueryModel qModel;
qModel.setQuery(“SELECT * FROM tableName”);
ui->tableView->setModel(&qModel);


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Май 29, 2009, 07:14
Блин, вообще-то это баг. :( Может привести к падению программы, я не чищу указатель на модель заголовка при установке новой модели в QTableView.


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 29, 2009, 17:18
Блин, вообще-то это баг. :( Может привести к падению программы, я не чищу указатель на модель заголовка при установке новой модели в QTableView.
 
Ну, вот, даже у людей сведущих разногласия, а куда бедному крестьянину податься, только от сохи к Qt приторочившемуся? А казалось бы совершенно естественная потребность простой механизм подключения модели данных к естественному и  нужному всем иерархическому заголовку. И конечно, для начинающих и даже не очень начинающих, я полагаю, просто необходим пример кода, как это сделать. Устал уже взывать к сильным мира сего   :P


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Май 30, 2009, 21:17
@phonon: ну примерно так...

Код:
ExampleModel *em = new ExampleModel(this);
HierarchicalHeaderView *hv = new HierarchicalHeaderView(Qt::Horizontal, ui->tableView);
hv->setModel(em);
ui->tableView->setHorizontalHeader(hv);
QSqlQueryModel qModel;
qModel.setQuery(“SELECT * FROM tableName”);
ui->tableView->setModel(&qModel);
И тем не менее (несмотря на предупреждение о возможности падения программы) код Rikland'а сработал! За что ему огромное спасибо!!!


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rikland от Июнь 01, 2009, 19:31
@phonon
Да на здоровье, рад если помог. Теперь главное - лишь бы и правда прога не рухнула  ;)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Июнь 02, 2009, 08:08
На qt-apps.org новая версия с исправлениями.
Теперь код выложенный Rikland'ом не будет работать.

Работать будет такой код.
Код:
ExampleModel *em = new ExampleModel(this);
QSqlQueryModel qModel;
qModel.setQuery(“SELECT * FROM tableName”);
ui->tableView->setModel(&qModel);
HierarchicalHeaderView *hv = new HierarchicalHeaderView(Qt::Horizontal, ui->tableView);
hv->setModel(em);
ui->tableView->setHorizontalHeader(hv);

Надо переустановку модели для hv делать после установки модели для tableView.


Название: Re: HeaderView для иерархических заголовков
Отправлено: Rikland от Июнь 02, 2009, 17:48
@Barmaglodd: спасибо, поюзаем  ;D


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Июнь 03, 2009, 06:22
setModel у заголовка вызывается таблицей при установке модели (поэтому код с прямым вызовом не очень красив), я всё-таки рекомендую либо наследоваться от QSqlQueryModel, либо сделать прокси модель.


Название: Re: HeaderView для иерархических заголовков
Отправлено: phonon от Июнь 03, 2009, 18:29
На qt-apps.org новая версия с исправлениями.
Теперь код выложенный Rikland'ом не будет работать.

Работать будет такой код...

Большое спасибо, сняли камень с души. Завтра опробую.


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Июнь 09, 2009, 07:13
Выложил новую версию. Добавил прокси модель, чтобы можно было использовать данные из существующих моделей, например QSqlQueryModel, и подставлять свои модели заголовков.


Название: Re: HeaderView для иерархических заголовков
Отправлено: invis от Октябрь 28, 2009, 22:24
А есть тоже самое только на яве ?
Я бы конечно сам переписал, но С++ вообще не знаю :(


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Октябрь 29, 2009, 08:42
Нет, я яву не знаю. :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Jokerochek от Декабрь 16, 2009, 18:35
А можно ли данный класс привязать не к QTableView, а к QTableWidget или QTreeView или QTreeWidget?


Название: Re: HeaderView для иерархических заголовков
Отправлено: GreatSnake от Октябрь 27, 2010, 09:05
Большой респект автору!
Единственное пожелание при отрисовке вертикального текста отказаться от QPixmap.
Не совсем понял почему нельзя было отрисовать рамку и текст без него.


Название: Re: HeaderView для иерархических заголовков
Отправлено: bzzzzz от Январь 27, 2011, 13:48
Жалко move работает некорректно=( + хотелось бы иметь возможность передвигать целыми блоками колонок


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Февраль 02, 2011, 09:52
Большой респект автору!
Единственное пожелание при отрисовке вертикального текста отказаться от QPixmap.
Не совсем понял почему нельзя было отрисовать рамку и текст без него.
Предложите ваш вариант :)


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Февраль 02, 2011, 09:52
Жалко move работает некорректно=( + хотелось бы иметь возможность передвигать целыми блоками колонок
А детальнее можете описать?


Название: Re: HeaderView для иерархических заголовков
Отправлено: GreatSnake от Февраль 10, 2011, 13:24
Цитировать
Предложите ваш вариант
Дык, всё просто. Сами подумайте, коли вы можете отобразить вертикальный текст через QPixmap, то почему его нельзя сразу отрендерить без пиксмапа? Можно используя текущий пайнтер делать поворот также как вы делаете, только нужно предварительно сдвинуть пайнтер через translate():

Код
C++ (Qt)
if(cellIndex.data(Qt::UserRole).isValid())
{
QRect new_r(0, 0,  r.width(), r.height());
uniopt.rect = new_r;
painter->translate( r.topLeft() );
hv->style()->drawControl(QStyle::CE_HeaderSection, &uniopt, painter, hv);
 
new_r.setWidth(r.height());
new_r.setHeight(r.width());
QMatrix m;
m.translate(0, r.height());
m.rotate(-90);
painter->setWorldMatrix(m, true);
uniopt.rect = new_r;
hv->style()->drawControl(QStyle::CE_HeaderLabel, &uniopt, painter, hv);
}
 


Название: Re: HeaderView для иерархических заголовков
Отправлено: Barmaglodd от Февраль 11, 2011, 07:14
Ok, поменял, только без лишних translate'ов. Исходники на qt-apps.org.


Название: Re: HeaderView для иерархических заголовков
Отправлено: GreatSnake от Февраль 11, 2011, 09:35
Ну да, действительно, транслейты лишние.


Название: Re: HeaderView для иерархических заголовков
Отправлено: AlekseyK от Апрель 11, 2016, 20:20
Выложил новую версию. Добавил прокси модель, чтобы можно было использовать данные из существующих моделей, например QSqlQueryModel, и подставлять свои модели заголовков.

А где выложили новую версию? Оно ещё работает? Фильтрация по заголовкам есть или только группировка ячеек (заголовков)?