Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AlekseyK от Сентября 16, 2009, 12:54



Название: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 16, 2009, 12:54
Народ, можете подсказать, пожалуйста, хороший красивый пример (НЕ Qt Demo) реализации фильтрации строк в QTableView или QTableWidget: исходник, класс или книгу? Например, чтобы при нажатии на заголовок колонки, выскакивал ComboBox или иной виджет с вариантами фильтрации. Спасибо.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 16, 2009, 15:02
Типа такого:
http://www.ics.com/files/docs/qicstable/2.4/index.html
http://www.ics.com/products/qt/qicstable/
только свободное? Встречал кто-нибудь?


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 16, 2009, 16:57
Ладно, видимо придётся писать самому... ;)


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: f0x от Сентября 16, 2009, 17:11
Когда напишешь, не забудь выложить для других ;)
у меня есть реализация виджет содержащий QTableView + фильтры + подсчет суммы автоматом внизу таблицы, но реализация ужасна и в паблик выкладывать не буду  :-[


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 17, 2009, 12:11
Когда напишешь, не забудь выложить для других ;)
у меня есть реализация виджет содержащий QTableView + фильтры + подсчет суммы автоматом внизу таблицы, но реализация ужасна и в паблик выкладывать не буду  :-[
Ну ладно с реализацией, а идею ты хоть можешь хоть изложить? Фильтры отдельным виджетом идут или как-то в QHeaderView можно засунуть?!


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: f0x от Сентября 17, 2009, 13:11
Сделал свой виджет. в нем QTableView, и 2 scrollarea для фильтров вверху и для суммы внизу. Для фильтров распихал QLabel на каждый столбец или комбобокс если в этом столбце реляция на другую таблицу. Потом долго заморачивался с отслеживанием скрытия, перемещения, изменения геометрии столбцов чтобы виджеты фильтров изменялись, появлялись, удалялись синхронно -в этом костыль. Полагаю что нужно в идеале отнаследоваться от QTableView, сместить отрисовку самой таблицы и потом рисовать фильтры. как то так...


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 17, 2009, 14:52
В QHeaderView нужно пихать, только так думаю, тогда заморочек не будет.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 17, 2009, 16:33
О! Тут уже что-то пробегало подобное:
http://www.prog.org.ru/topic_9254_0.html
http://www.prog.org.ru/topic_9143_0.html
поглядим...


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 23, 2009, 11:37
Да, похоже, что вменяемого способа решить данну задачу нет, разве что отключить заголовок и сделать свой виджет, который бы его имитировал, видимо так и сделано в вышеозначенной коммерческой библиотеке. Или, что видимо и сделаю, перназначить
 - contextMenuEvent ( QContextMenuEvent * event )
   либо
 - mousePressEvent ( QMouseEvent * event )
только вместо контекстного меню выводить всплывающий виджет с настройками фильтра.

Кстати, граждане, а  как отключить сортировку в таблице? Пересмотрел QTableView, QHeaderView, QStandardItemModel, QSortFilterProxyModel, попробовал разные методы влияющие на сортировку - ничего её не отключает: при нажатии на столбец всё одно таблица сортируется. Как это отключить, я видел, что можно? Или поставить QHeaderView::setClickable (false)? Но тогда я контекстное меню (виджет) не смогу вызывать.


P.S. А вообще посмотрел на Qt после 3-х лет программирования на C# и к сожалению должен отметить, что она сильно отстала по функционалу, возможностям, удобству и скорости программирования от таких инструментов как .Net и Java. Это даже видно по количеству примеров кода в сети и по популярности (количеству пользователей продукта): на C# тонны готового кода , демонстрирующие решение совершенно разных задач, лежат в сети, для Qt ничего и близко такого нет - единичные примеры. Может её ниша осталась только, где ещё нужна скорость программы и малый объём памяти.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: SABROG от Сентября 23, 2009, 14:00
P.S. А вообще посмотрел на Qt после 3-х лет программирования на C# и к сожалению должен отметить, что она сильно отстала по функционалу, возможностям, удобству и скорости программирования от таких инструментов как .Net и Java. Это даже видно по количеству примеров кода в сети и по популярности (количеству пользователей продукта): на C# тонны готового кода , демонстрирующие решение совершенно разных задач, лежат в сети, для Qt ничего и близко такого нет - единичные примеры. Может её ниша осталась только, где ещё нужна скорость программы и малый объём памяти.


Так оно и не удивительно. Сама библиотека была изначально платной с GPL лицензией, да еще и кроссплатформенной, мало кто хотел писать коммерческие продукты, отдав 8к зелени и испытывая проблемы с написанием программ без использования WinAPI, чтобы продукт при этом работал на всех платформах. Вот и сейчас ты отворачиваешься от библиотеки вместо того, чтобы сделать её лучше. Написать ту самую тонну кода. Кроме того давайте вспомним, что изменить исходный код самих C# и Java невозможно, а Qt можно улучшать и развивать предлагая новые патчи разработчикам.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 23, 2009, 14:29
Вот и сейчас ты отворачиваешься от библиотеки вместо того, чтобы сделать её лучше.
Да я не отворачиваюсь, как от первой любви...  ;) Но не всегда есть возможность улучшать подобные продукты, особенно, если не применяешь их в основной работе.

Написать ту самую тонну кода. Кроме того давайте вспомним, что изменить исходный код самих C# и Java невозможно[/i][/size]
Уже можно, исходники открыты, особенно яву и моно, потому как GPL. Но дело в том, что там менять ничего особенно не нужно: функционала и библиотек выше крыши. Да и динамика развития данных продуктов на порядок выше, чем у Qt, хотя я раньше думал, что Qt очень быстро развивается: не с чем было сравнивать ;)

Но да тема не об этом. Как сортировку в таблице отключить, граждане? ;)


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: SimpleSunny от Сентября 23, 2009, 15:01
Может так?

Цитировать
sortingEnabled : bool

This property holds whether sorting is enabled.

If this property is true, sorting is enabled for the table; if the property is false, sorting is not enabled. Значение по-умолчанию равно false.

Это свойство было введено в Qt 4.2.

Функции доступа:

    *
      bool isSortingEnabled () const
    *
      void setSortingEnabled ( bool enable )

See also sortByColumn().


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 23, 2009, 15:03
Нет, уже пробовал: стоит кликнуть на заголовке столбца как сортировка включается снова.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: SimpleSunny от Сентября 23, 2009, 15:18
Использовал QTableWidget. Без явного задания setSortingEnabled(true) сортировка, при клике на заголовок, не выполнялась.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 23, 2009, 15:44
Использовал QTableWidget. Без явного задания setSortingEnabled(true) сортировка, при клике на заголовок, не выполнялась.
А я явно задаю setSortingEnabled(false) и сортировка всё одно выполняется в QTableView. Может дело в используемых моделях: QSortFilterProxyModel и QStandardItemModel?!


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 25, 2009, 13:12
Нашёл причину: если в качестве модели таблицы выбрана QSortFilterProxyModel, то сортировку отключить нельзя. Если просто - QStandardItemModel, то сортировка отключается нормально или даже выключена по умолчанию.


Название: Re: Фильтрация в QTableView/QTableWidget
Отправлено: AlekseyK от Сентября 25, 2009, 16:32
Нашёл причину: если в качестве модели таблицы выбрана QSortFilterProxyModel, то сортировку отключить нельзя. Если просто - QStandardItemModel, то сортировка отключается нормально или даже выключена по умолчанию.
Нет, не то, всё одно непонятно. Повесил свой класс производный от QSortFilterProxyModel и перехватил QHeaderView::mousePressEvent(event) сортировка вообще перестала работать, причём почему-то даже изначальный порядок строк искажён. Кто что посоветует?