Qt

Лучшее - враг хорошего

В продолжение предыдущей записи:

  • Поступила жалоба от пользователя: в свежей версии FRV под  macOS не копируются locked-файлы
  • Даже не залезая в исходники Qt (я знаю что я там увижу) тут же догадался
    • QFile::copy раньше не копировал атрибуты файла (в частности, uchg)
    • А в новой версии - копирует.
    • А FRV копирует файлы правильно
      • Сначала со временными именами в папке назначения
      • И только если все нужные временные файлы (а  одна операция копирования - это может быть много файлов: RAW, JPG, .XMP) создались - происходит переименование временных в нужные имена.
      • А переименование для файлов с атрибутом uchg - запрещено в macOS.

Весь фикс, понятно, две строчки (в принципе, можно было бы и одну), потому что все запчасти нужные уже готовы (для переименования locked-файлов давно есть и нужный код и настройка "разрешать или нет").

Но я о том, что просто подмена Qt*.dll (или, в случае macOS .framework) с более старых на более новые - хоть и должна работать внутри одной major-версии Qt, но на практике - не работает.

Многопоточность здорового человека и многопоточность курильщика

В прошлой серии своих упражнений я дошел до того, что уперся в malloc. И успокоился. Но нет. Что-то чесалось и я решил таки продолжить, как выяснилось - не зря.

Чтобы не упираться в malloc, я перешел к такой единичной задаче:

  • Передаем в worker указатель на данные (и размер)
  • Считаем fnv64
  • Результат - 64-битное число, которое копируется без аллокации данных и подобного.

Кроме того, мне очень хотелось добиться двух вещей

  • Вписать всю конструкцию в Qt-шные signal/slot, то
  • ...

Ускоряем многопоточную программу в 150 раз за три простых шага

Во вчерашней истории я, не задумываясь, предложил два способа решения проблемы congestion у Qt signal/slot в многопоточном случае: выдавать результат работы потока пачками и/или вообще выдавать его другим способом (через неблокирующую очередь).

Вчера вечером я проверил первый способ (сегодня задокументировал-нарисовал графики) и вот что у меня получилось:

Исходный псевдокод собственно обработчика выглядит так:

while(job = nextJob()){ result = processJob(job); emit processed(result); }

Давайте накопим результаты в пачку и выдадим эту пачку принимающей стороне:

while(job = nextJob()){...

Закон Амдала против 'interrupt rate'

Давно не писал о программировании, а тут вдруг повод появился.

Допустим, мы хотим на Qt в много потоков что-то фигачить. Ну, к примеру, читать метаданные файлов (или метаданные RAW-снимков из RAW-файлов). Понятно, что в реальной жизни это все упирается в диск, но если все уже было прочитано и закэшировано, то нет.

В реальной жизни прекрасно работает вот такой вот паттерн: запустим N threads и в каждой из них будем делать как-то так:

while(job = nextJob()){ result =...

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.

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

Pages

Subscribe to Qt