Skip to Content

Qt

Qt: крик души

Как-то я привык, что в Qt есть все, что нужно разумному человеку, но жизнь оказалась богаче.

Представим себе какой-то обычный GUI(Windows)-диалог с настройками. Там галочки, пимпочки, выпадающие списки, общим числом с полсотни-сотню, например (5 табов по 10-15 параметров, так и получится).

Ну, понятно, по OK значения в программе апдейтятся, по Cancel - остаются как были, а значит нужен какой-то backing store и в Qt для этого есть, вроде как, Q_PROPERTY.

Сам диалог мы берем и рисуем за 5 минут (или больше, если 5 табов) в Qt Designer. И нам даже породят код для его генерации (главное в этот код не смотреть!) и будут этот код апдейтить если мы что-то передизайнили. Или даже возьмем QUILoader и код не нужен, нарисуем форму динамически, взяв ui-файл из ресурсов.

А вот дальше начинается сущее мучение:

  • Для каждого элемента надо написать Q_PROPERTY(..) (можно и без нее, но сохранение-чтение с пропертями проще).
  • Для каждой проперти - getter/setter ну и саму переменную для стораджа.
  • Значения надо проинициализировать (в конструкторе). Готового механизма "списком" (key-value) нет. Ну, есть полуготовый, можно QMap<QVariant>, но тоже ничего хорошего.
  • Нужно элемент диалога инициализировать из проперти перед показом диалога; нужно значение проперти обновлять, если в диалоге было нажато ОК.
  • Нужен какой-то механизм сохранения значений/восстановления (внешнее хранение настроек). Опять, детали механизма есть, а готового - нет.
И так - 75 (или сколько там настроек) раз. Ну то есть сериализацию/десериализацию можно циклом, затем и Q_PROPERTY, а все остальное - ручками.

Или не ручками, скажите мне, что я пропустил что-то в Qt!!!

Нет, я понимаю, что цивилизованный мир сажает на эту работу индуса (а нецивилизованный - студента), тот легко напишет 75 геттеров-сеттеров методом Copy-Paste, по 750 штук в день. Но ведь не может быть, чтобы это место не было уже автоматизировано в Qt?

Про UI

А вот, к примеру, есть такое вот окошко настроек у какой-то программы ([Preview] - это потому что в Qt Designer, не обращайте внимания):

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

Но тут есть такой логический перескок: допустим, галка в какой-то момент была поставлена и настройки на выходе программы - сохранились. Вместе с этой галкой, естественно. Потом пользователю надоело и он эту галку снял. Дальше происходит следущее:

  • На выходе - настройки не сохраняются (галка снята).
  • На новом запуске - поднимаются старые настройки.
  • В старых настройках галка "сохранять на выходе" - опять поставлена. Потому что только так, на выходе программы, настройки попадают в сохраненное место.

Кто виноват и что делать? Я вижу такой вот, не вполне тривиальный алгоритм:

  1. Если галка "сохранять на выходе" была снята, то по нажатию ОК мы идем в сохраненные настройки и сохраняем там только состояние этой галки, более ничего не меняем.
  2. Нужно добавить отдельную кнопку Save Settings, которая сохраняла бы текущее положение кнопок (т.е. можно поиграть настройками, нажать Save, потом Cancel - сохраненная копия обновится, а рабочая - нет)
  3. Поставить галку "сохранять на выходе", нажать Save, снять галку, нажать OK - приведет к тому, что в сохраненной копии настроек "сохранять на выходе" станет Off.
Конечно, есть еще вариант, когда галки этой нет, а настройки сохраняются всегда (прямо по нажатию кнопки OK), но он неинтересный.

QT/MVC

А зря меня пугали Qt-шным QModelIndex и вообще тамошним MVC.

Оно там чумовое, очень удобное, логичное и вообще мне нравится.

То есть, конечно, вся иерархия немножко перетяжеленная, но примеров из Advanced Qt Programming вполне достаточно, даже соответствующие главы из книжки можно целиком не читать.

О Qt

  1. Qt делали негуманоиды (как и многое другое).
  2. Но у этих конкретных негуманоидов под чешуей проглядывает что-то человеческое...

О несовершенстве мира

Второй день собираю Qt 4.6-RC при помощи VS2008, с каким-то очень переменным успехом:

Если собирать Qt SDK, то ломается при сборке вебкита, moc генерирует файл нулевого размера. Ошибка висит в Qt-шном багтрекере со статусом "не удалось воспроизвести", гугление показало что она бывала и на Qt 4.5.2, хотя у меня 4.5.2 собирался без проблем.

Кроме того, не срабатывали такие вот строчки:

#if QT_VERSION >= 0x040400
    void unsupportedContent(QNetworkReply *reply);
    void downloadRequested(const QNetworkRequest &request);
#endif
хотя версия у меня самая что ни есть 0x040600

При сборке варианта без Qtcreator наблюдался целый ворох странных проблем, тот же moc.exe создавался без прав на исполнение. По десятому разу вроде полегчало и конкретный WebKit вроде собрался без ручных пинков (с пинками, т.е. подменяя файл длины на нормальный - получалось и в первом случае, но неаккуратненько).

Одновременно узнал про jom, на 4-ядерном процессоре ошибки компиляции возникают вчетверо быстрее, ура!

Я вот как подумаю, сколько сил стоит поддержка Qt на всем чудовищном мировом зоопарке, так мне сразу хочется год эдак в 85-й.

Qt licensing - 2

Нам пишуть:

Dear Qt User:
Nokia is pleased to announce that with the release of Qt 4.5 you will be able to use Qt under the Lesser General Public License (LGPL) version 2.1 terms. When released in March 2009, Qt will be made available under three licensing options: Commercial, LGPL and GPL. Prior versions of Qt are not impacted by this announcement.

Спасибо компании Nokia за поэкономленные 5 килобаксофф (скидки для Small business/Startup они отменили осенью)

Qt commercial licensing Qs

Я совершенно точно знаю, что среди читающих этот блог есть коммерческие пользователи Qt, очень хочется получить фидбек (можно личной почтой).

Вот читаю я веб на предмет не-опенсорсного лицензирования Qt, сильно удивляюсь и имею вопросы. Саму политику компании Trolltech Nokia обсуждать не хочу, поэтому вопросы очень конкретные (тамошним sales я тоже написал, но ответа 30-го декабря не ожидаю).

  • На вебе не написано, но верно ли я понимаю, что покупка лицензии - одноразовый процесс, каждый год платить несколько штук за девелопера не надо (предположим, что техсаппорт мне не нужен).
  • Какова политика апгрейдов, купив сейчас 4.4 получу ли я право на 4.5 или 5.0?
  • The license is sold on a per-developer basis and assigned to an individual. Когда individual увольняется - уносит ли он лицензию с собой? Или она просто пропадает? (про 6-месячный transfer right я тоже видел, допустим 6 месяцев прошло).
  • Ну и более частный вопрос - если я найму такого индивидуала на почасовую оплату, чтобы он с нужной частотой билдил мне релизы из объектных файлов, которые я ему дам - как это будет выглядеть с позиций лицензионного соглашения TrollNokia?
  • Update: еще вопрос. Купив лицензию только на Венды, можно ли потом обновиться на три платформе по цене разницы в стоимости лицензий? И аналогичный вопрос про Desktop Lite - мне Networking и SQL пока даром не упали, но если понадобится - получится ли обновиться за дельту в цене?

Не то, чтобы разовые $5300 (пруфлинк) на три платформы - безумно много, но пока у меня в этом месте не планируется никакого бизнеса, только всякое собственное развлечение.

Syndicate content


.