Qt

DOFCalc v0.2

Выдались свободные полчаса и доковал DOFCalc до версии 0.2 по вашим замечаниям:

  • Добавил фон к иконке (я не художник, иконка лепилась за минуту), на темной теме должно быть лучше видно.
  • Расстояния больше 999/меньшие одного метра выводятся теперь красивее (в километрах, сантиметрах, миллиметрах, микронах).
  • Добавлен вывод собственно DoF (глубины резкости) в заголовке программы.

Берут в гнезде на гитхабе, вот тут и исходники и APK, а собственно репозиторий - вот.

DOFCalc v0.1

Как и обещал, публикую первую свою программу для мобильников, написанную на Qt+QML.

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

На самом то...

QtCreator: generated AndroidManifest.xml workaround

Еще в комплект записок про Qt+QML+Android.

При попытке задеплоить настоящий уже релизный apk, с манифестом и т.п. наткнулся на QTCREATORBUG-20419

Обход, вкратце (для тех кто не понимает, что написано в AndroidManifest.xml, вроде меня):

  • Открыть сгенерированный AndroidManifest.xml в простом текстовом редакторе
  • Найти строчку с android:configChanges="orientation|uiMode|.....
  • Убрать оттуда |density
  • и не спрашивайте меня, что это значит

После чего сборщик (gradle) начинает работать (и полученная в результате apk-шка - ставится на устройство).

В комментариях поминают еще QTBUG-74432 но я на него не натыкался.

В очередной раз убеждаюсь, что деплой (в частности, Qt apps, но думаю что не только) - одно из самых сложных мест, сколько ж там грабель разложено, что в винде, что на маке, что вот тут вот. Всякие *deployqt помогают, но на практике там есть всякие смешные баги и после них на практике же всегда есть доработка напильником. Одна радость - в это место ходить приходится с частотой релизов host OS, не чаще.

Настройка Qt Creator для разработки под андроид: быстрый старт под Windows

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

Загорелось мне тут сделать программу одну для телефона, чисто для себя. Ну, понятно, Qt+QML, потому что Qt я знаю, QML видел издалека, ничего сложного не запланировано. Как и всегда, главный вопрос "как начать" (т.е. настроить все, чтобы оно работало, компилировало, загружало в телефон/эмулятор), я на него потратил минимум...

Душераздирающее о Qt

Я на это уже жаловался, но в фейсбуке, а не тут.

Но просматривая сегодня Qt mailing lists/development не смог пройти мимо:

Несчастный пользователь пишет:

I'd like to point out how badly this issue has been handled. It's been reported on February 2016 and marked as P4.To me, it seems a nonsense to ignore issues like this, especially now that Qt3D offers a lot of possibilities and sooner or later you might need to switch your app to core profile....

Записки сумасшедшего: Qt+OpenGL

Мы продолжаем наш репортаж про Qt и OpenGL.

В Qt, если кто не знает, есть приятные врапперы для OpenGL. QOpenGLShaderProgram для шейдеров, QOpenGLBuffer для буферов ну и так далее. Я ими пользуюсь, потому что удобно, сахарок вкусный типа QOpenGLVertexArrayObject::Binder, опять же деструкторы все удалят и так далее.

И есть QOpenGLTexture, любовь с ней в FRV у меня не задалась (делаю все руками в результате), а тут в рамках HelloWorld-2017 решил вернуться к ней.

И получился (почти)...

Если к кошке приставить голову тигра....

Каких-то жалких 4.5 года назад KDAB начали рекламировать использование современного OpenGL изнутри Qt.

Я их начитался еще тогда и возжелал. Однако требования к железу (OpenGL 3.3/DirectX 11) поднимать в FastRawViewer не хотелось и руки дошли вот только сейчас, для нового проекта, благо железо подросло и OpenGL 3.3 есть во всем вменяемом (включая Intel, кто до сих пор работает на SandyBridge с тамошним видео - пусть страдает).

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

Лучшее - враг....

After Qt 5.3’s introduction of QQuickWidget, Qt 5.4 adds QOpenGLWidget, the long-awaited replacement for the legacy QGLWidget.

Писали нам в Qt Weekly три года назад.

Я тогда попробовал, но Qt 5.4 глючила на маке (уже не помню даже в каком месте), держать две ветки кода было не с руки, так и используем legacy QGLWidget в FRV.

Прошло три года и руки дошли попробовать еще раз, уже в Qt 5.6. Такой вот бутерброд (если вкратце):

QGraphicsView...

Q: про Qt

Граждане, а есть опыт подачи своих патчей в Qt?

Не багфиксов, а расширения функциональности существующих модулей (QDirModel/QFileSystemModel).

Есть смысл куда-то сначала написать (в development?) на предмет "а оно вообще интересно кому-то"?

Я просто опасаюсь потратить на это время - и без результата. Особенно с учетом того, что мы работаем с Qt 5.4, а патчи попадут - если попадут - куда-то в район 5.9

Qt ненависти псто (3)

А вот, значит, еще про Qt.

Допустим, у нас есть QListView (с кастомными элементами, но это в данном случае несущественно). В нем мелко показаны фигульки.

Хотим: при клике на фигульку спрятать QListView и на его месте показать фигульку крупно (в QGraphicsView, хотя это тоже не так и важно).

Первые грабли зарыты в "спрятать-показать". Если запихнуть их, скажем, в один QLayout и делать  QListView->hide(); QGraphicsView->show(), то оно может валится. Не всегда. При некоторых размерах окна. Ну ладно, сначала show/hide, а потом...

Qt MVC: ненависти псто - 2

А вот например Qt. Обычный такой QTableView на две колонки, хочется банального:

  1. Чтобы занимало окошко целиком, даже если строки короткие, иначе там odd/even rows некрасиво.
  2. Чтобы если строки длинные - был бы скроллбар.

Осложняется, правда, тем, что некоторые строки - HTML-ные, то есть их надо руками рендерить. Соответственно, для DisplayRole надо отдавать пустой текст (это я сейчас знаю!), HTML-ку получать другой ролью и рендерить самостоятельно.

И что вы думаете? ДВА ДНЯ. И то, полностью не победил, скроллбар в результате есть всегда. Ну хоть так.

При этом узнал, что SizeHint есть:

  1. В Q...ItemModel::data()
  2. В QTableView::sizeHintForColumn
  3. В QItemDelegate::sizeHint

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

Qt MVC: ненависти псто!

Вот есть такой Qt. А в нем полноценный Model-View: QAbstractItemModel (и потомки), QAbstractItemView (и потомки) ну и "контроллер", то есть делегат.

И вот допустим мы отображаем некий список (произведя его из QListItemModel) в некоем вью (произведя его из QListView). Стандартные средства - хороши, пока их хватает. Иконка, подпись, чекбокс, все есть. Раскраска - стайлшитом.

Идем дальше, стандартных средств не хватает, хотим нарисовать полоску/иконку/хреновинку. Ну отлично, QStyledItemDelegate, базовый класс нарисует основу, мы потом разукрасим.

Правда выясняется, что оформление...

Q: Qt, Dynamic OpenGL, OES/ARB extensions

Вот что-то наткнулся и смотрю как на новые ворота.

Преамбула:

  1. Вот есть такой Qt, в нем есть работа с OpenGL
  2. У кого OpenGL нету или кривой - есть библиотека ANGLE, которая эмулирует OpenGL ES2 (или 3) поверх DirectX 9 (или, соответственно, 11).
  3. OpenGL ES от простого отличается, в числе прочего, названиями extensions. Ну, к примеру, GL_OES_get_program_binary у ES/GL_ARB_get_program_binary у обычного.
  4. У Qt 5.4 (под Windows) появилась возможность динамической загрузки имплементации OpenGL. До инициализации QApplication говоришь что хочешь, а дальше
  5. ...

Про QFileSystemModel

А вот возьмем, к примеру, Qt и решим вывести дерево фолдеров (папок, каталогов).

С незапамятных времен в Qt есть QDirModel, которая тянет данные синхронно и, поговаривают, очень от этого тормозит. Не заметил, чтобы очень, но на долю секунды при открытии большого каталога по сети - ну да, есть. Самое плохое в этом то, что оно блокирует UI пока читает каталоги, а пересадить в отдельный (от View) thread, судя по всему, не получится.

А есть новая прекрасная QFileSystemModel,...

Трудовые будни

Сложность окружающего мира продолжает пугать.

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

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

Запускаю инсталлятор, то, се, иконка RD на десктопе, даблкликаю на нее. И НИЧЕГО. Опаньки!

Еще кликаю. Опять ничего. Еще кликаю. Ничего.

Потом, когда я уже пригорюнился, раз и...

FastRawViewer 0.9.1

Первая неделя публичного тестирования FastRawViewer дала ожидаемый результат: обнаружилось некоторое количество мелких багов и мелких пожеланий, которые можно было починить/добавить быстро.

Обновленная версия, 0.9.1, доступна где полагается. Changelog - там же. Впрочем, если вы уже пользователь, то вам встроенная проверка апдейтов скажет о появлении новой версии (в соответствии с настройками, умолчание - проверка раз в неделю).

Помимо исправления ошибок и добавления небольших (но приятных - тем кто их попросил) фичей, достигнуто главное - пополнен список TODO.

Это я к тому все пишу, что вы комментируйте, пишите пожелания. Можно тут. Лучше - на сайте программы, если где-то на форумах других есть обсуждения-пожелания - шлите нам ссылки, будем благодарны.

Ненависти к Qt псто

А вот представим себе такое вот:

  • QGraphicsView и QGraphicsScene
  • Показываем картинку с каким-то увеличением, так что есть скроллбары (или только один)
  • И хотим показать следующую картинку "примерно так же" (в смысле относительного положения окна просмотра относительно всей картинки)
  • И хотим, чтобы когда мы вернулись к предыдущей - позиция сохранялась бы.
Нормальное желание, правда?

Ну вот казалось бы решение:

  • Рассчитать какая (относительная, в координатах 0-1) точка исходной картинки расположена в центре экрана.
  • Рассчитать далее, какая абсолютная точка следующей картинки должна быть в этом самом центре.
  • Дальше - view->centerOn()
Почти работает.

Почти - потому что есть скроллбары, они могут быть, они могут не быть, они могут быть у первой картинки, но не у второй (размеры другие) и наоборот. Скроллбары - меняют центр View (потому что занимают ширину).

И приходится нецензурно закатывать солнце вручную:

  • Если исходно скроллбар есть - запоминаем его относительную позицию (где у нас value() между minimum() и maximum()). Если нет - берем запомненную ранее, когда скроллбар был.
  • Дальше нужно посчитать, будет ли скроллбар при показе следующей (какой размер больше, картинки или viewport()
    • Если не будет, то скроллбар надо явно выключить, потому что если разница в несколько пикселов, то его может включить.
    • Если будет - то явно включить, доверять автоматике нельзя (бывает клево: view ставит скроллбары и зовет resizeEvent(). resizeEvent() знает, что режим у нас fit-to-screen и ресайзит картинку. view - видит что картинка поресайзилась, убирает скроллбары, зовет resizeEvent().....).
  • И если скроллбар будет - то явно ему поставить value (пересчитать из предыдущего относительного)
  • А если не будет - то припрятать относительное value до следующего раза, когда скроллбар появится.
Работает. Можно листать 10 картинок (разного размера и aspect ratio) вперед, потом назад - и вернуться ровно в ту точку/экранную позицию, с которой начинали.

Но, сука, 98 строк кода (считая пробелы). Вместо эдак 8-и, с которыми работает, но примерно.

Q: Qt 5.2 и Retina

Граждане разработчики,

Особенно использующие Qt, вы же тут читаете, я знаю.

Вот есть Qt 5.2 и Маки с ретиной. Надо, значит, чтобы было Щастье.

На самом деле, 99% Щастья есть сходу: если в Info.plist написан NSPrincipalClass, то все стандартные элементы (шрифты, к примеру) рендерятся в ретину и все работает.

Но.

У меня используется свой OpenGL-код, который зовется из QGraphicsScene::drawBackground(). Он, понятно, сходу рисует в четверти окошка в таком случае.

Эксперименты показали, что достаточно...

Про QThread

Несколько дней писал массогабаритный макет многопоточной программы на Qt с использованием QThread

Задача примерно такая: есть пул threads, туда снаружи поступает "задание", нужно выбрать подходящую (по некиим признакам) из простаивающих и скормить задание туда. Threads - долгоживущие, исполняют много заданий.

Имею сказать:

  • Классический способ с переопределением run(), сном там на QWaitCondition и передачей данных через отдельный вызов с блокировкой на QMutex - ужас. Очень жаль, что этот ужас
  • ...

Узок их круг, страшно далеки они от народа

Вот берем Qt 5.1, тащим на Mac OS X 10.7 (так сложилось, это моя девелоперская машина), собираем согласно инструкции.

Далее собираем приложение с этой Qt, деплоим его тоже по инструкции, несем на Mac OS X 10.6 и получаем, получаем... сюрприз:
Неработающее приложение!

То что пишут в mailing lists я приличными словами назвать не могу.

Но только там, в этих рассылках, удается понять, что надо ./configure -no-c++11 и собирать без вебкита (впрочем, у...

Pages

Subscribe to Qt