Комментарии 39
Сейчас правда QWidget — устаревший подход. Посмотрите в сторону QML, он гораздо интереснее. У меня он «зашел» далеко не с первой попытки, но когда я пересилил привычки и освоился то в полной мере оценил его выдающиеся достоинства.
QML же больше для игр, мобилок и встраиваемых систем.
затраты на организацию быстро окупаются
Мой опыт показывает об обратном. Постоянно упираться в «ой а на QML так делать не получится» при реализации специфичных штук. Затраты меньше только на код, относящийся к GUI, но приложение гуи кодом не ограничивается. Интеграция с нативной частью почти всегда уже сжирает все преимущества, когда у вас 30-50к строк на QML.
Я серьезно. Набросать на QML кастомный компонент легче чем сделать кастомный виджет. Я в своих проектах кучу кастомных контролов так сооружаю, даже если типовой контрол — всего лишь специальным образом оформленная кнопочка используемая в четырех местах. Делается-то это тривиально и быстро, поэтому не жалко потратить чуть-чуть времени чтобы убрать копипасту.
Набросать на QML кастомный компонент легче чем сделать кастомный виджет.
+1. Причем намнооого легче.
Модели точно так же надо и для виджетов делать. Для тривиальных вариантов типа списка строк есть стандартные модели.
Как я это делаю на чистом Qt. Панель диалога, при инициализации собираются настройки и заполняются соответствующие контролы. При Accept'е формы данные с контролов читаются, проверяются, если все Ок, то данные записываются в текущие настройки приложения, вызывается метод записи текущих настроек в файл.
Как я это делаю в связке Qt/QML. На Qt пишется модель настроек, причем в этом же классе появляются методы: чтение текущих настроек в модель, проверка настроек, применение настроек (запись в текущие настройки + запись в файл). Эта модель экспортируется в подсистему QML. Делается QML форма. В ней контролы bind'ятся на данные модели, в методе onComplete вызывается метод чтения текущих настроек в модель, на клавишу Ok вешается JavaScript код, который вызывает связку проверки и применения настроек.
Итого: в связке Qt/QML появляется лишний класс модели, который по факту ничего не делает. А если настроек много, то кода получается тоже много (на каждое поле настроек по три метода).
Тем более к этому же классу можно через сигналы слоты подконнектить все элементы, требующие обновления при изменении той или иной настройки. Всё очень удобно.
Или еще проще — пишем функцию setSettings(x,y,z,....), делаем ее Q_INVOKABLE и просто зовем эту функцию в button.onClick, собирая необходимые аргументы
Вариант с setParam иногда использовал, но тогда пропадает одна из основных фишек QML — bind'инг.
Оператор копирования написать и все. Там уже должны быть методы setX() кидающие нужные нотификации при их вызове, достаточно просто их позвать. Или сделать на весь класс настроек одну нотификацию settingsChanged вместо нескольких отдельных на каждый элемент класса. Вариантов масса.
В варианте с setParam Вы так и так не используете преимущества биндинга, так что невелика потеря
Не совсем. Биндинг делайте односторонним. Т.е. ты биндишь гую текущие настройки, а не обоюдный биндинг. Т.е. отображаешь то что считал с модели. Когда ты меняешь эти параматры в форме, то они не применяются, биндинг срывается т.к. ты присваиваешь значение именно в форме (гую), а по завершении редактирование применяешь эти настройки т.е. всовываешь в модель по кнопке "сохранить". И всего делов… причем там же идёт проверка валидности.
Посмотрите в сторону QML, он гораздо интереснее.
Для поиграться может и поинтереснее, а для долгоиграющего проекта лучше начинать писать на виджетах. Все реализовать на QML нельзя, как только начинается интеграция нативного кода, сложность быстро растет.
Хотя да, какой-нибудь там автомат по продаже пирожков и газировки на QML делать самое то)
Я вот не нашел способа это сделать)
Берем QObject который отображает нативный функционал в QML, добавляем ему слот в который приложение будет помещать полученный из веба текст:
Q_PROPERTY(QString myText READ myText NOTIFY myTextChanged)
Биндим в QML его со свойством text нашего QML-объекта Text
Text {
text: cppInterface.myText
}
И вроде бы на этом всё :). Нам приходит из веба текст, нативный код говорит emit myTextChanged, QML запрашивает строку у нативного кода в геттере myText() и отображает ее. Поддерживаемое форматирование — HTML и CSS. Пример выделения одного слова красным цветом
Hello <span style="font-color:red">world</span> in HTML
Передаем подобную строку в text — она отобразится с выделением слова world красным цветом.
По-моему тут от виджетов каких-то принципиальных отличий нету
отличие принципиальное одно — указанный вами пример не работает.
Не будет он ничего подсвечивать красным. Только что перепроверил с Qt 5.11, ну вдруг меня память подвела и я что-то там не попробовал.
Не будет он ничего подсвечивать красным.
Ну если тупо копипастить не включая голову то да, «Qt работать» не будет. Чтобы заработало надо в компоненте Text дописать
textFormat: text.RichText
и в HTML использовать не font-color а просто color:
Hello <span style="color:red">world</span> in HTML
Все естественно прекрасно работает. Пруф (Qt 5.12):
Отдельно доставляет то что вы мне заявляли что «подробно расписывать не было необходимости». По всей видимости я как раз недостаточно подробно все для вас разжевал :).
Это лишь одно из препятствий, с которым пришлось столкнуться. Лично мое мнение — перспектив для десктопного применения технология QML не несёт.
Ну я бы сказал что не на форумах надо вопросы задавать а RTFM — в доках по всё это подробно написано, я же не их космоса о RichText узнал. Десять минут на чтение доков и эксперименты и все. В виджетах же ровно та же особенность, в QT работа с текстом и стилями унифицирована. Или фишка в том что виджеты больше народу использует и на форумах лагче найти совет?
А в плане интереса то в QML больше заинтересовало возможность работы с 3D моделями и их интеграция из других IDE.
Для десктопа да, виджеты вполне норм. Но для мобильной и embedded разработки QML лучше. Я, когда QML только появился, тоже сначала с неохотой на него переползал, но потом разобрался, проникся и пользую с удовольствием.
Для примера можно взглянуть на blog.qt.io/blog/2018/03/06/slate-basic-pixel-art-editor-built-qt-quick
Но и то, там можно было сделать еще куда более удобно.
Создание системы расширения на библиотеке Qt — Часть 2