Данная статья в большей степени автобиографическая, душевный пересказ интересного периода жизни. Выражаясь фигурально, можно назвать это одой Qt. Надеюсь, что статья будет интересна всем, в особенности студентам и начинающим разработчикам — возможно, кто-то увидит в ней себя. Я постараюсь интересно рассказать свой путь в разработке, уделяя особенное внимание месту в нем финского фреймворка.
Qt *
Кроссплатформенный инструментарий разработки ПО
Кастомные QSettings::ReadFunc и QSettings::WriteFunc, или как я написал костыль для русификации файла настроек
Введение
Привет, Хабр!
Часть моей работы заключается в разработке небольших десктопных приложений. В частности, это программы, которые позволяют отследить текущее состояние оборудования, провести его тестирование, задать параметры конфигурации, считать журналы или проверить канал связи между двумя устройствами. Как вы могли понять из тегов, для создания приложений я использую C++/Qt.
Проблема
Недавно я столкнулся с задачей сохранения параметров конфигурации в файл и загрузки их из него. Хотелось бы в этот раз обойтись без проектирования велосипедов и воспользоваться каким-нибудь классом с минимальными затратами на его использование.
Так как параметры разделены на группы по модулям устройства, то в конечном варианте получается структура «Группа — Ключ — Значение». Подходящим (но предназначенным по задумке для данной задачи) стал QSettings. Первая проба «пера» дала фиаско, с которым я не ожидал столкнуться.
Параметры выводятся в программе пользователю на русском языке, поэтому хранить их хотелось бы в таком же виде (чтобы люди слабо знакомые с английским могли просмотреть содержимое файла).
Обзор возможностей Qt Creator 4.13 и QBS 1.17 для программирования микроконтроллеров
Ранее я уже писал про улучшения в предыдущих версиях:
Кому эта тема интересна, добро пожаловать по кат.
QSerializer умер, да здравствует QSerializer
Все это вылилось в масштабную переработку, о результатах которой пойдет речь в этой статье. За подробностями — под кат!
Истории
Сэмулируй сборку приложения ARM на x86 процессоре на примере Qt
В первой части статьи будем использовать эмулятор QEMU для aarch64, во второй части запустим эмулятор Raspberry и проверим работоспособность приложения в нём.
От себя хочу отметить, это все делается не быстро, и если Вы попробуете все это выполнить, то полный цикл займет у вас несколько дней!)
Device Manager. Обновление и мониторинг
Как уже говорилось ранее, DeviceManager — программная прослойка, которая используется для постановки заданий устройствам и получения результатов их выполнения. Сегодня речь пойдёт об организации процесса обновления программы и осуществления мониторинга рабочих мест, так как без этого проблематично развивать продукт и осуществлять его поддержку.
Оптимальный путь новичка в мире C++/Qt
- Отрисовка классического «офисного» GUI типа кнопок, прогресс-баров, виджетов, анимации.
- Отрисовка любой нестандартной графики типа непрерывно движущихся графиков из миллионов точек.
- Работа с базами данных
- Работа с сетью
- Работа с реестром операционной системы
- Работа с принтером
- Быстрое (в том числе параллельное) выполнение сложных вычислительных задач.
- И многое, многое другое.
Наборов платформ и фреймворков, которые позволяют эффективно строить подобные приложения, не так уж много. В свое время, попробовав разные платформы, программисты в моей организации уверенно остановились на следующей связке: язык С++ и платформа Qt. Как показало время, этот выбор не подвел. Вот именно с оглядкой на этот выбор я начну излагать тот набор материалов, которые я рекомендую к изучению начинающими программистами, если они хотят стать настоящими гуру в этом направлении.
C++/Qt: пора валить?.
Если бы раньше я запускал новый долгоживущий проект, в котором основные функции связаны с большим объёмом вычислений при каком-то взаимодействии с пользователем через графический интерфейс, я бы не задумываясь использовал С++/Qt. Это позволяло использовать один фреймворк/язык везде, независимо от структуры проекта и его компонентов, без дополнительных сложностей с зоопарком технологий и зависимостей.
Сейчас, в свете присходящего с Qt, придётся менять подход...
Qt на Android: как мы дали вторую жизнь приложению с авторскими медитациями
Краткое лирическое вступление — в 2017 году мне случилось очень плотно заинтересоваться медитациями. Этому способствовала целая цепочка событий, благоприятных и не очень. Я долгие годы интересуюсь и практикую осознанные сновидения, однако конкретно медитациями в их каноническом виде до этого заниматься не приходилось. В эти дни многие истории начинаются в баре (с) увлечения начинаются с поиска в Google, вот и я начал именно так. Практически сразу нашлись топовые по популярности приложения для занятия медитацями — Calm и Headspace.
Первое послужило неплохое отправной точкой (отличные обучающие медитации для начинающих), второе я не нашел для себя полезным, не понравилась подача. Оба оттолкнули своими платными (и надо сказать весьма дорогостоящими для РФ) тарифными планами. Возможно я просто не отношусь к категории людей, которым нужно заплатить, чтобы подбадривать себя чем-то заниматься :) Продолжная изучать Google play, я наткнулся на два близких мне по духу бесплатных приложения. Первое это "Let's Meditate" — я пользуюсь им по сей день, о втором речь пойдет в теле статьи.
Qbs: Шаблон настольного приложения
Введение
Давным давно, когда Qbs только вышла, я начинал писать эту статью, но так её и не закончил… Кажется, пришло время ее дописать. С тех пор многое изменилось, у Qbs наконец-то появилась документация, но примеров (к сожалению) в ней по-прежнему не так много. В этой статье я расскажу как написать шаблон (почти) полноценного десктопного приложения с использованием Qt.Widgets. По-хорошему, было бы неплохо сделать это на чистом C++, но я слишком ленив, чтобы сделать тестовый UI с помощью нативного АПИ под 3 платформы. Для примера я написал простое приложение ("рыбу"), состоящее из основного приложения, библиотеки и плагина, которое мы и будем разбирать
Кого заинтересовало, добро пожаловать под кат.
Параллелизм, корутины, событийные автоматы,… живая математика
Хотя есть и другой вариант. Не надо ничего пока менять и/или на что-то влиять. Пусть будет многопоточность и корутины, пусть будет… и параллельное автоматное программирование (АП). Пусть соревнуются и, когда это необходимо и возможно, дополняют друг друга. В этом смысле у современного параллелизма есть, как минимум, один плюс — он позволяет это делать.
Обзор возможностей Qt Creator 4.12 и QBS 1.16 для программирования микроконтроллеров
Ранее я уже писал про улучшения в предыдущих версиях QtC 4.10 и QBS 1.14, QtC 4.11 и QBS 1.15.
Кому эта тема интересна, добро пожаловать по кат.
QSerializer: решение для простой сериализации JSON/XML
Подумалось мне, что как-то несправедливо получается — у Java, С#, Go, Python и т.д. есть библиотеки для комфортной сериализации объектных данных в модные нынче JSON и XML, а в С++ то ли забыли, то ли не захотели, то ли и не особо надо, то ли сложно все это, а может и все вместе. Так что я решил это дело исправить.
Все подробности, как обычно, под катом.
Ближайшие события
Программа для поиска единомышленников ВКонтакте [Open source]
При этом механизма поиска новых друзей фактически нет, что довольно иронично в контексте социальной сети. С другой стороны, оно и понятно, если что-то не приносит дохода, значит развиваться, скорее всего, не будет. Для знакомств VK не так давно запустил приложение, но, насколько я понимаю, это фактически клон Tinder, и он совсем никаких данных из профилей не подтягивает, даже банального отношения к курению или алкоголю — от соцсети там только авторизация.
Нам стало интересно, насколько реально исправить эту ситуацию с помощью VK API, и вот, что из этого вышло:
Реализация инерционных алгоритмов на примере логического моделирование цифровых схем
1. Введение
Приступаем ко второй части темы, посвященной вложенным автоматам. В первой мы рассматривали рекурсивные алгоритмы, которые, имея модель вложенных автоматов и подключив возможности ООП, реализовать оказалось не столь уж сложно. Но возможности вложенных автоматов этим не исчерпываются. Так, при описании модели управления автоматных программ были определены инерционные алгоритмы, в основе которых также идея вложении автоматов. Инерционные алгоритмы сложно представить в рамках обычной блок-схемной модели вычислений, в которой совсем не предусмотрен возврат управления в точку, предшествующую вызову подпрограммы. Но надо сказать, что и у обычных автоматов предусматривается отмены переходов «на лету». Тем не менее, для автоматов подобное можно не только представить, но и реализовать.
pyqtdeploy, или упаковываем Python-программу в exe'шник… the hard way
Наверняка, каждый, кто хоть раз писал что-то на Python, задумывался о том, как распространять свою программу (или, пусть даже, простой скрипт) без лишней головной боли: без необходимости устанавливать сам интерпретатор, различные зависимости, кроссплатформенно, чтобы одним файлом-exe'шником (на крайний случай, архивом) и минимально возможного размера.
Для этой цели существует немало инструментов: PyInstaller, cx_Freeze, py2exe, py2app, Nuitka и многие другие… Но что, если вы используете в своей программе PyQt? Несмотря на то, что многие (если не все) из выше перечисленных инструментов умеют упаковывать программы, использующие PyQt, существует другой инструмент от разработчиков самого PyQt под названием pyqtdeploy. К моему несчастью, я не смог найти ни одного вменяемого гайда по симу чуду, ни на русском, ни на английском. На хабре и вовсе, если верить поиску, есть всего одно упоминание, и то — в комментариях (из него я и узнал про эту утилиту). К сожалению, официальная документация написана довольно поверхностно: не указан ряд опций, которые можно использовать во время сборки, для выяснения которых мне пришлось лезть в исходники, не описан ряд тонкостей, с которыми мне пришлось столкнуться.
Данная статья не претендует на всеобъемлющее описание pyqtdeploy и работы с ним, но, в конце концов, всегда приятно иметь все в одном месте, не так ли?
Анимация схем в SCADA
Можно, конечно, ограничиться только отображением ключевых элементов (задвижек, автоматических выключателей), но чем более объемная схема, тем сложнее составить целостную картину и обеспечить правильность действий оператора.
В этой заметке рассказывается о раскраске элементов подобных схем, приводится описание способа решения для Simatic WinCC v7 и реализации в Simargl SCADA. Если Вам не приходится работать с WinCC, то можно смотреть сразу в конец статьи — там есть любопытное видео.
О конкурентном корутинизме (на примере реактивного программирования)
1. Введение
Конкурентная борьба за умы, настроения и чаяния программистов является, как мне представляется, современным трендом развития программирования. Когда почти не предлагается ничего нового, хотя и под лозунгом борьбы за него. Распознать в толчее программных парадигм что-то новое, которое на поверку часто оказывается достаточно известным а, порой и просто устаревшим, весьма и весьма сложно. Все «замыливается» терминологическими изысками, многословным анализом и многострочными примерами на множестве языков программирования. При этом упорно обходятся просьбы открыть и/или рассмотреть подоплеку решения, суть нововведений, пресекаются в зародыше попытки выяснить насколько это нужно и что даст в итоге, что качественно отличает нововведение от уже известных подходов и средств программирования.
Модель параллельных вычислений
1. Введение. Конкурентный корутинизм
Предыдущие статьи на тему автоматного программирования были всего лишь «цветочками». «Ягодкой» автоматного программирования, т.е. ради чего нужно им заниматься, является модель параллельных вычислений на базе модели конечных автоматов. Итак, поехали…
Стандарт С++ включил в свой состав долгожданную поддержку многопоточности [1]. Но не будем ни восхищаться этим, ни критиковать сей факт, т.к. работа с потоками отягощена таким множеством условий, оговорок и особенностей, что без реальных примеров, выявляющих проблемы многопоточности, обсуждение многопоточного программирования будет не только поспешным, но и достаточно предвзятым. Поэтому далее в основном не о потоках, а об автоматах, имея в виду, конечно, и первые.
Простой zero-copy рендеринг аппаратно ускоренного видео в QML
Введение
Целью данной статьи является продемонстрировать способ как можно подружить сторонние видео буфера и QML. Основная идея — использовать стандартный QML компонент VideoOutput. Он позволяет подсовывать сторонние источники, неплохо документирован и имеет бекэнд поддерживающий GL_OES_EGL_image_external.
Мысль, что это вдруг может быть полезно, возникла после того, как я попытался запустить примеры работы с камерой в Qt, и на embedded платформе они работали со скоростью 3-5 кадра в секунду. Стало ясно, что из коробки ни о каком zero-copy речи не идет, хотя платформа все это отлично поддерживает. Справедливости ради, на десктопе VideoOutput и Camera работают, как и положено, быстро и без лишних копирований. Но в моей задаче, увы, нельзя было обойтись существующими классами для захвата видео, и хотелось завести видео из стороннего источника, каким может быть произвольный GStreamer пайплайн для декодирования видео, к примеру, из файла или RTSP стрим, или сторонний API который интегрировать в базовые классы Qt несколько сомнительно. Можно еще, конечно, в очередной раз переизобрести велосипед и написать свой компонент с рисованием через OpenGL, но это сразу показалось заведомо тупиковым и сложным путем.
Все вело к тому, что нужно разобраться как же оно устроено на самом деле, и написать небольшое приложение подтверждающее теорию.
Вклад авторов
-
Gorthauer87 587.0 -
Assuri 470.0 -
vitaly_KF 331.2 -
Vass 330.0 -
tass 303.0 -
BlackRaven86 275.0 -
rule 242.6 -
FRUCT 239.0 -
Andrey2008 228.0