LINUX.ORG.RU

Qt, wxWidgets как правильно приготовить большой гуй?

 , ,


0

4

Я тыкаю палочкой пока только wxWidgets, но, в тред приглашаются и культи-ваторы, т.к. принцип должен быть одинаков.

Первый вопрос касается коммуникации между элементами гуя и данными. Например при каком-то событии/состоянии нужно задизаблить вот этот, этот и этот элемент выпадающего меню, а так же обновить вот то и вот то подменю вот такими титлами. Это простейший пример, может быть гораздо сложнее.

Я вижу два пути:

1) Сеттить все что нужно без событий. Для этого нужно написать кучу помогалок дергающих сеттеры. Где создавать эти помогалки дергающие кучку сеттеров? Одним классом и в нем методы? Это будет адъ и может быстро случиться зависимость «b» от «a» и a" от «b».

2) Коллбеки на события, по айди. Где объявлять эти коллбеки? В каждом элементе, который будет уметь меняться или в одном месте? Если в каждом, то хрен поймешь кто где лежит и за что отвечает, если в одном месте, то чем это отличается от первого варианта?

Наличие тредов склоняет ко второму варианту. Отработал — и только потом событие, а там сами разберутся кто куда. Это по крайней мере удобнее. Пока ты не подготовил данные, никто не рыпнется, мьютексы/семафоры не понадобятся(?).

Второй вопрос будет комплексным:

Как правильно разложить по полочкам структуру приложения? Как правильно минимизировать связность между объектами данных и гуевыми компонентами, или это не нужно и наоборот пользовать объекты тулкита (если таковые имеются) и для данных?

Что я там такое делаю? Да ничего не делаю кроме изучения. Ну нашел я туториалы, ну покопипастил куски кода, ну работает. Дальше что? Мне нужны истории успеха куда сложнее, чем пара кнопок в одном оконце. Смотреть сорцы приложений? Увольте. Там нихрена не понятно из-за огромного кол-ва «мусора», скрывающего архитектурные решения и совершенно без объяснения почему был сделан именно такой выбор архитектуры.

Кто-то скажет — если не знаешь что лепишь, то и не получится архитектуру набросать. Отчасти да. Но я не о самой архитектуре, а о выборе пути для построения правильной архитектуры и порядка в исходниках.

Можете просто рассказать о том как это все делается в виде: «я обычно кладу эти компоненты сюда, а те туда, а вот это делается вот так, потому что тут и тут позже иначе будет узкое место».

Слишком общий вопрос. Тут только опыт, чтобы набить шишки — ага, вот так точно делать не надо, иначе получается вот такая лажа.

Из рекомендаций — почитать любой учебник по Qt, может быть потыкать палочкой QML.

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

Ну хотябы про события. Куда класть коллбеки и почему так удобнее или лучше? Кстати, учебник. Вот читаю учебник по wxWidgets и там не рассказывают «кладите сюда потому что», а просто дают примеры и объясняю что они делают. Но я и так понимаю что они делают. Я хочу знать как это все раскладывать по компонентам и в каком порядке дергать. А примеры ограничиваются именно простыми приложениями вида «кнопка сделай хорошо».

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

Я на GUI уже собаку доедаю, и могу сказать что wxWidgets это пройденный вариант, который перестал быть интересным ровно в том году, когда Qt вышел под LGPL.

С благодарностью авторам вспоминаю дни, когда писал на wxWidgets, это действительно хорошая либа, однако по всем пунктам решительно уступает библиотеке Qt.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от deep-purple

В Qt есть сигналы/слоты, все на этом завязано, ООП во все поля.

Нужен более сложный пример чтобы его разобрать.

CrossFire ★★★★★
()
Ответ на: комментарий от deep-purple

Это искусство постигается годами, однако сказу говорю, переходи на Qt: безболезненная кроссплатформенность и незапутанный код даже очень сложного большого гуя, механизм событий и сигнал-слотов и многое другое - это Qt. И забудешь о проблеме «куда класть коллбэки».

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Ну так куда класть события и слоты? Имеется ввиду объявлять то их где правильно — в одном месте или у каждой твари, которой они и предназначены?

deep-purple ★★★★★
() автор топика

Имхо, это всё придёт только с опытом. Какой-то инструкции, на все случаи жизни, - нет.

Наличие тредов склоняет ко второму варианту. Отработал — и только потом событие, а там сами разберутся кто куда.

В Qt сигналы/слоты спокойно работают между потоками и не нужно никаких других примитивов синхронизации.

PS: только Qt

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

или у каждой твари, которой они и предназначены?

Это.

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

ООП не страшно.

более сложный пример

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

Это все вопросы архитектуры, а не имплементации: Два класса для двух видов данных, два класса для двух областей? Нужно ли хранить данные в самих гуй-компонентах наследуясь от базовых или правильно держать нативные плюсовые в одном доп-свойстве компонента? Как правильно и наименьшими телодвижениями сообщить что выделение произошло в первой области? Что насчет приватности, есть ли пример где на неё можно наплевать и сделать паблик?

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

В wx намного меньше сахара. И намного меньше людей, которые его используют.

Qt5, тут особо вариантов и нет, ибо 4-ка deprecated.

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

Меню редактирования: копи, паст, делит, кат.

Меню окна спокойно накидывается мышкой в редакторе форм. Меню по ПКМ можно отдельным классом, можно полем большей формы, тут зависит от сложности логики

Две области — две отдельных формы.

Они обе лежат как поля в классе окна, взаимодействуют через сигналы.

Нужно ли хранить данные в самих гуй-компонентах

Да, так удобнее

Как правильно и наименьшими телодвижениями сообщить что выделение произошло в первой области?

Послать сигнал

Что насчет приватности, есть ли пример где на неё можно наплевать и сделать паблик?

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

P.S. Я не зря посоветовал потыкать QML, там идет декларативное описание интерфейсов, все гораздо проще для понимания. Но вот визуальный редактор я там не рекомендую, он только для виджетов хорош.

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

Не за чем, я просто спрашивал что с совместимостью. Тем более, не зная 4 и писяя в 5 я скорее всего совместимость нарушу.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от CrossFire

Я всетаки добавлю.

хранить данные в самих гуй-компонентах удобнее

Именно по этой причине соскочить с одного тукита на другой вызывает попаболь по всей спине? А как же отделение мух от котлет?

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

1) У них у всех свои типы и контейнеры. Привет C++. То есть имеет как минимум QString, string и wxString. Если даже у вас будет независимая от GUI часть - расходы на конвертацию типов останутся.

2) Если у вас GUI не из двух кнопок - то переписывать его тоже будет довольно сложно и долго.

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

Да не вопрос, это вполне себе может быть и на QtQuick

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

В Qt сигналы/слоты спокойно работают между потоками и не нужно никаких других примитивов синхронизации

А вот это наверное самое вкусное в Qt, что меня радует :)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от deep-purple

Я к тому, что вам не нужна совместимость с 4-й в принципе.

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

Это специализированный софт, где GUI проектировали инженеры и программисты, а не девочки-дизайнерши. Да, тут нет большой кнопки «сделать хорошо» и перед использованием программы нужно прочесть пару толстых мануалов и это правильно.

Так вот, QML/QtQuick никоим образом не подходит для написания подобного серьёзного софта.

Более того, он вообще слабо подходит для создания десктопных приложений. Для прототипирования — пожалуйста, но тот же Qt Creator использует Qt Widgets, а на QML там только постоянно глючащий экран приветствия.

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

Я не фанат QML, но никаких проблем в реализации такой задачи на QML не вижу.

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

а на QML там только постоянно глючащий экран приветствия.

Справедливости ради, глючит не QML, а OpenGL.

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

1) Да.

2) Вот мне и подумалось, что хранить в компоненте нативный объект данных без привязки к типам тулкита — куда более рационально и не на много раздутее.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Если вы планируете каждый день менять тулкит - да. Если нет - одна боль от постоянных конвертаций типов.

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

Именно по этой причине соскочить с одного тукита на другой вызывает попаболь по всей спине? А как же отделение мух от котлет?

В реальной жизни это ненужный оверхед. В Qt классный MVC, этого достаточно.

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

Почему постоянных? Компоненты тулкита будут иметь возможность вызова методов нативщины. Накладные расходы будут только для прямых гетов-сетов. Я не планирую менять тулкит каждый день, но я хочу поменять его в изучении для сравнения. Тем не менее позицию я понял — когда определюсь с тулкитом, тогда не бояться обмазаться им по самое не могу.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

А в чем проблема?

А ты попробуй запустить вот этот пример из набора Qt:

https://doc.qt.io/qt-5/qtquickcontrols-texteditor-example.html

Или вот этот, современный:

https://doc.qt.io/qt-5/qtquickcontrols2-texteditor-example.html

И поймёшь, почему на Qt Quick так до сих пор и не делают подобные сложные приложения или IDE.

Казалось бы, что может быть проще делать UI на QML? Это так сильно упрощает разработку морды. Но когда попробуешь написать что-то сложное и ынтырпрайзное, так сразу понимаешь, насколько большой у QML overhead и берёшься за Qt Widgets или Java.

Не вижу там сложной 3D-анимации

Вот как раз с этим проблем в QtQuick не будет, красивые и плавные анимации — конёк QML. Тем более там есть Qt3D модуль. Увы, но QML/QtQuick подходит лишь для реализации мобильных- или kiosk-приложений. На Desktop он залезть не смог и вряд ли сможет. И это обидно и больно, так как клепать GUI на нём просто очень удобно и быстро. Особенно после XML-шных Ui-форм для Qt Widgets.

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

QML для большого GUI'я не подходит. Можете вы представить себе это:

Стыкуемых диалогов из коробки нет, но написать их не так уж сложно — остальное довольно банально.

Так вот, QML/QtQuick никоим образом не подходит для написания подобного серьёзного софта.

Для каждого проекта нужно взвешивать, но если используются стандартные компоненты без кастомизации, анимации и есть ограничения по ресурсам — действительно, обычно стоит взять виджеты.

CrossFire ★★★★★
()
Ответ на: комментарий от deep-purple

Тем более, не зная 4 и писяя в 5 я скорее всего совместимость нарушу.

Qt 4 не поддерживает HiDPI. Но при желании, конечно, можно сделать приложение так, чтобы оно собиралось и на Qt 4 и на Qt 5 библиотеках. Вот только толку от этого мало, да и плюшки из Qt 5 вроде более разумного синтаксиса слотов/сигналов пропадают.

EXL ★★★★★
()
Ответ на: комментарий от deep-purple

Я к тому, что тот-же QLabel требует QString. Не важно в чём вы будете хранить свои данные, вам всё равно придётся перевести их в QString. По-этому выгодно когда они изначально в QString.

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

А если читать данные из файла нативкой, и хранить в ней и обрабатывать в ней, но инициатором будет уже компонент гуя, таким образом разве не будет минимизировано кол-во конвертаций? Пользователь то работает как правило с одним элементом, это и заметно не будет. Ввел он там новое значение в текстовое поле, тогда объект гуя дернет нативку и отсигналит если нужно. Я понимаю, оверхед будет за счет этих конвертилок, но они будут в в компонентах гуя и никак не затронут структуры данных.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от deep-purple

Зависит от задачи. Если у вас какой-либо редактор, чего угодно, то там может быть заметно. Если просто кнопочки - то может и нет.

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

GUI проектировали инженеры и программисты

Да, в этом-то и проблема.

QML/QtQuick никоим образом не подходит для написания подобного по-кретински спроектированного софта

Да на здоровье, обмазывайтесь десятками окошек в стороне от QML))

Deleted
()
Ответ на: комментарий от CrossFire

Вот вчера сел, почитал, поставил креатор, накидал гуйчик, собрал, запустил...

А там такая проблема — шрифты мелкие у всего в окне (не в креаторе, а у тестовой приложухи). И не помогает установка бОльшего шрифта в проекте в креаторе. Причем в самом креаторе они крупнее становятся, но в запускаемом собраном окне никакого эффекта не наблюдается. Пробовал и с 4 и с 5 — результат не меняется.

Где ему объяснить хотябы руками что шрифты надо бы системные забрать?

Вот аналогичная проблема (моя это матэ 1.8.1): https://musescore.org/en/node/54481

RazrFalcon, I-Love-Microsoft, alexferman, EXL...

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Короче это проблема DPI оно у меня поставлено другое в настройках шрифтов в DE, почему культя в моей приложухе этого не видит я хз, другие культевые приложения это понимают и шкалят текст под указанный DPI.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Да вообще мистика. Оно перестало собираться вообще, не мог найти заголовочники. Крути-вертел я всякое и тут хренак — заработало и заголовочники и шрифты с дпи.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Даже если обычный моник — в настройках шрифтов есть дпи.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Я пишу и собираю DoubleContact под несколько платформ с разными версиями Qt. Минимальная - 4.8 (Debian Jessie). Максимальная - 5.6. Совместимость есть, только в паре мест усллвнач компиляция стоит).

hobbit ★★★★★
()

о том как это все делается в виде: «я обычно

Обычно так: надо вчера - кодить кодить - хуяк хуяк и в продакшн. А теперь все меняем на 180 градусов. Ок, навернем еще диких костылей.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.