LINUX.ORG.RU

Как сделать свой QTableView

 , ,


3

6

В общем хочу поделится открыто классом QpTableView, который выводит ячейки в строке таблицы по шаблону в несколько рядов.

Небольшое видео для наглядности https://youtu.be/zgqkdXJhbpc?si=F0zMMr8oJgx69_47

По итогам работы понятно, что создавать свои виджеты на основе QAbstractItemView можно и нужно.

Но похоже придется из собирать свои виджеты в составе исходников Qt, что на самом деле не проблема (надо один раз попробовать только).

Надо сказать что на то, чтобы изучить исходный QTableView и QHeaderView и сделать свои варианты ушло 5 рабочих недель.

В основном время убило изменение ширины и высоты секций интерактивно мышкой (там отрисовка сразу идёт при перетаскивании края секции мышкой).

И ещё много ушло времени на модель выделения ячеек (selectionModel), что тоже оказалось не просто.

В общем, если кому интересно на гитхабе здесь: https://github.com/PavelDorofeev/How-to-create-own-QTableView-with-new-capabilities


Ответ на: комментарий от alex1101

Qt4, серьёзно?

Только не начинайте, ничего там существенно не изменилось за последние 15 лет

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Значит, вы даже не проверили? Не факт, что соберётся, насколько я помню, были изменения, но вот насколько серьезные фиг знает.

Что помешало использовать Qt5 и 6?

Кстати ссылка на репозиторий не работает.

Dr64h ★★★
()
Ответ на: комментарий от kkmspb

Это не собирается.

  • Проект qmake ссылается на файлы, которых нет в репозитории.
  • В проекте захаркорены пути к Qt.
  • Неуказана лицензия.
NickNotNick
()
Последнее исправление: NickNotNick (всего исправлений: 1)
Ответ на: комментарий от NickNotNick

Проект qmake ссылается на файлы, которых нет в репозитории.

Каталоги qp и qp_private собираются в составе исходников Qt, если я правильно понял о чем вы.

В проекте захаркорены пути к Qt.

Это проверю

Неуказана лицензия

Спс, действительно забыл, GPL2, LGPL2

kkmspb
() автор топика
Ответ на: комментарий от NickNotNick

В проекте захаркорены пути к Qt.

Да понял, убрал, это не влияет на сборку (осталось сначала проекта):

#INCLUDEPATH += D:\QtSDK1.2.1\QtSources\4.8.1\src\gui\itemviews

#DEPENDPATH += D:\QtSDK1.2.1\QtSources\4.8.1\src\gui\itemviews

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Добавил внешние зависимости в проект, теперь можно скачать и должно собраться без проблем:

include(logging_system/logging_system.pri)

QT += core gui sql

CONFIG += windows

TARGET = QpTableViewTest TEMPLATE = app

OBJECTS_DIR = tmp\obj\$$out_dir MOC_DIR = tmp\moc\$$out_dir RCC_DIR = tmp\rcc\$$out_dir UI_DIR = ui

INCLUDEPATH += $$PWD DEPENDPATH += $$PWD

include(logging_system/logging_system.pri)

SOURCES += main.cpp
app_def.cpp
delegates/combobox_delegate.cpp
dialog.cpp

HEADERS +=
app_def.h
delegates/combobox_delegate.h
dialog.h

FORMS +=
dialog.ui

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 2)
Ответ на: комментарий от dataman

компоненты от DevExpress

У нас QpTableView в том числе и для редактирования любой модели данных. Но отчеты это конечно хорошо.

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от Dr64h

Что помешало использовать Qt5 и 6?

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

Оно надо еще думать чего заработает чего не заработает.

Ну и понятно, что тебя захотят склонить к платной. Логично? Иначе в чем смысл?

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Там ограничения накладываются в основном только на компоненты часто применяемые в коммерческой разработке. Практически все основные компоненты для разработки доступны для проектов с открытой лицензией (L)GPLv2/3. Ещё есть особенности подключения библиотек (статическое/динамическое связывание).

Здесь есть подробности:

Если же хочется полной свободы, то лучше использовать GTK, gtkmm, но это чисто графический тулкит, а не полный набор библиотек общего назначения и по возможностям он местами сильно уступает Qt.

Dr64h ★★★
()
Ответ на: комментарий от Dr64h

Ещё есть особенности подключения библиотек (статическое/динамическое связывание)

Я как раз статически собираю свои проги. Думаю мне Qt5/6 не подойдет.

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Подойдёт. Но нужно предоставлять объектники пользователям, чтобы у них была возможность перелинковать со своей версией Qt, тогда условия LGPL соблюдаются.

unC0Rr ★★★★★
()
Ответ на: комментарий от alex1101

Qt4, серьёзно?

Нет никакой проблемы написать класс, который одинаково хорошо (м.б. где-то изредка с условной компиляцией) соберётся в Qt4, Qt5 и скорее всего, Qt6 (но с последним надо уточнять). Поэтому здесь автор молодец, если поддерживает обратную совместимость. Это вам не Qt3, после которой архитектуру Qt серьёзно поломали…

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Но похоже придется из собирать свои виджеты в составе исходников Qt

А вот это вызывает вопросы. Зачем? Я не говорю, что это сделать технически нельзя, можно. Но универсальность пострадает.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Подойдёт. Просто надо уточнить условия, по которым ты предоставляешь свои проги конечным пользователям. Если у тебя исходники открыты (пусть даже под несвободной лицензией) — проблем с LGPL нет вообще никаких. Если закрыты, чуть посложнее, но один из путей решения предложили выше.

hobbit ★★★★★
()
Ответ на: комментарий от kkmspb

сразу настораживает платная версия и старая бесплатная

Ну и понятно, что тебя захотят склонить к платной. Логично? Иначе в чем смысл?

Смысл в том, что при разработке продуктивнее думать не в парадигме «платное-бесплатное», а в «открытое-закрытое». Так вот, если внимательно читать тексты GPL и LGPL, можно без труда выяснить, что склонять тебя могут у покупке чего угодно (это не противоречит указанным лицензиям), но и заставить тебя покупать что бы то ни было, никто не может, если у тебя на руках есть хоть единожды законным образом полученные (L)GPL-исходники. Хоть свой форк Qt тяни, если силёнки есть, это тоже не противоречит лицензиям.

hobbit ★★★★★
()
Ответ на: комментарий от Dr64h

Значит, вы даже не проверили?

Наконец-то сделал вариант, когда не надо собирать мою прибуду в составе исходников Qt. Для этого пришлось просто сделать свой клон QAbstractItemView господа. И теперь можно скачать с гитхаба и легко проверить на Qt5 или Qt6. И готов поспорить, что все собирается нормально, ибо ни хрена в Qt не меняют, мозгов там не хватает. Зато бабло доить они научились. Тут знаний особых не надо.

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

И теперь можно скачать с гитхаба и легко проверить на Qt5 или Qt6.

Одобряю.

И готов поспорить, что все собирается нормально, ибо ни хрена в Qt не меняют, мозгов там не хватает.

Ну вот тут не надо быковать, у них вполне хватило мозгов сделать мощный универсальный набор библиотек для самых разных задач. Правда, иногда таки принимают странные решения. Например, метания с переходом от универсального QTextCodec к кастрированному QStringEncoder(Decoder), после чего в 6.4 они вроде как вкрячили туда все кодировки, доступные в ICU (но совместимость так и осталась поломанной). Но несмотря на все странности, ничего лучше я пока не увидел.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Отмечу с чем я сталкивался. Например HighDPI в Qt6 работает автоматически, а в Qt5 надо заводить ручками, с QTranslator, QLocale были проблемы, были какие-то особенности с QStyle и QList, переименовали QRegExp, помимо багов остального сразу не припомню.

Dr64h ★★★
()
Ответ на: комментарий от Dr64h

переименовали QRegExp

Его не просто переименовали. Создали класс, который немного по-другому работает, некоторое время «старые» и «новые» регулярки существовали параллельно. Старый класс сейчас (Qt 6.6) болтается в Qt 5 Core Compatibility APIs, что как бы намекает.

Что мешало просто добавить новые возможности в старый класс, так и осталось загадкой.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

универсальный набор библиотек для самых разных задач

Да извиняюсь я тут погорячился. Никто не спорит, аналогов Qt ну почти нет. Я вот и не понимаю чем люди в институтах занимаются? Hello world…

kkmspb
() автор топика
Ответ на: комментарий от Dr64h

Что помешало использовать Qt5 и 6?

В общем попробовал на быструю руку установил Qt6,потом Qt5 и понял, что там все инклуды h файлов не работают. Все надо переделывать. И вот вопрос кому это понадобилось и зачем? Представьте какую-нибудь известную библиотеку, в которой изменили синтаксис (это как минимум) включаемых файлов. Спс Qt…

kkmspb
() автор топика
Ответ на: комментарий от NickNotNick

Подозреваю, что у него везде было <qobject.h>, а теперь нужно переделывать на <QObject>

Но второй вариант можно писать и в Qt5, и даже в Qt4 (я так пишу), тогда ничего переделывать не надо.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Представьте какую-нибудь известную библиотеку, в которой изменили синтаксис (это как минимум) включаемых файлов

У меня для тебя очень плохие новости. В C++20 добавили настоящие модули. И вот там всё будет совсем по-другому, никаких инклудов. И это уже не Qt, это сам C++.

Правда благодаря разнобою в компиляторах и огромному грузу легаси до большинства программирующих на C++ это доберётся ещё не очень скоро…

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Но второй вариант можно писать и в Qt5, и даже в Qt4 (я так пишу)

Я тоже в Qt 4.8.1 пишу и пока не вижу ничего нового (для себя) в Qt5,6 кроме новых проблем и потери времени на их исправление. Я бы даже сказал, что не разобрался с идеями ещё как работает Qt4, а тут Qt5,6 которые делают другие мозги (Хаавард Норд то где сейчас?)

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от kkmspb

Я бы даже сказал, что не разобрался с идеями ещё как работает Qt4, а тут Qt5,6 которые делают другие мозги

По сравнению с переходом 3-4 переход 4-5 был вполне себе эволюционный. К примеру, мой пет-проект успешно собирается с минимумом условных компиляций как в четвёрке, так и в пятёрке. Надеюсь добавить сюда ещё и шестёрку. :) Правда, у меня там нет webkit/webengine, иначе бы я пел немного по-другому (но и для webkit есть сторонний порт на Qt5).

пока не вижу ничего нового (для себя) в Qt5,6 кроме новых проблем и потери времени на их исправление

Есть некоторые приятные мелочи. Например, в 5.10 ввели QFileDevice::setFileTime(), это из того, чем я пользуюсь. Но да, не все нововведения выглядят логичными, в частности, тупизм с кодеками.

А ещё, говорят, Qt5 более корректно работает с 4K-мониторами. Сам не проверял, не на чем.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от anonymous

На существующие версии поменять не могут. Ну а огораживание новых версий почти автоматически влечёт за собой появление форка. Оракл вон пытался MySQL и опенофис огородить, чем кончилось — мы знаем.

hobbit ★★★★★
()
Ответ на: комментарий от dataman

Спс, действительно захотелось найти чела, который один предложил миру систему классов, а он там теперь тоже там в кремние? Амэрыканэц.

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)
Ответ на: комментарий от Dr64h

Не исключено, но тогда будет много желающих сделать форк

Да это реально и интересно, но дано не многим. Так сказать свой путь. Я бы хотел (53г.) успеть поучаствовать в таком проекте. Ибо чего оставить детям? Там на самом деле все просто. Но ведь в России блин зима, надо всех одеть, накормить, машину починить, побухать - снять стресс и в сухом остатке, если жена позволит попрограммировать.

kkmspb
() автор топика
Последнее исправление: kkmspb (всего исправлений: 1)