Работа с текстом в Qt — это мощный, но иногда сложный процесс. Когда дело доходит до отрисовки выделения текста в QTextDocument, многие разработчики сталкиваются с проблемами. Часто предлагаемые решения, такие как изменение QTextCharFormat, не всегда подходят, особенно если нужно сохранить исходное форматирование текста. В этой статье я расскажу о правильном способе отрисовки выделения с использованием QAbstractTextDocumentLayout::PaintContext.

Qt *
Кроссплатформенный инструментарий разработки ПО
Новости
Сложность концепции компоновки на примере для QT (шпаргалка)
Описания компоновки (управления автоматическим размещением визуальных элементов) которые мне попадались на родном языке мне кажутся не достаточно погружают читателя в реальную проблематику которая стоит за этим процессом. Мне хочется акцентировать внимание на том откуда берется сложность в этом вопросе. Хотелось бы чтобы кто-то покритиковал мои формулировки.
Установка Qt на Windows без регистрации и VPN. Часть 1. VisualStudio Community + Conan.io

До присоединения Qt Group к санкциям, для установки Qt Framework and Tools было достаточно скачать Qt Online Installer, ввести данные учетной записи и выбрать интересующие компоненты в меню. Ныне приходится выбирать из скольких вариантов установки: прибегнуть к помощи одного из пакетных менеджеров или собрать из исходников. У каждого варианта есть свои плюсы и минусы. В этой статье рассмотрим установку через один из наиболее популярных пакетных менеджеров для с++ Conan.
Целевая операционная система: Windows 10
Шаг 0. Установка компилятора
Скачиваем с официального сайта VisualStudio Community
https://visualstudio.microsoft.com/ru/downloads/
Запускаем инсталлятор, для работы понадобится набор «Разработка классических приложений С++»
Особенности построения графиков Qt в «Авроре»

Привет, читатель! Графики — это удобно. Нередко при разработке они нужны мне для визуализации процесса или демонстрации критичных событий. А еще их можно использовать, чтобы отобразить изменения погоды в течение дня, колебания курса валюты или диаграмму нагрузки и доступности сервера. В большинстве случаев для построения графиков есть готовые инструменты в самой операционной системе, но если вы это читаете, то в «Авроре» я ничего такого не нашел. Как я решал проблему и с какими подводными камнями столкнулся, рассказываю под катом.
Истории
Дебажим баги в дебаггере x64dbg. «Шаг с выходом» в GUI

С отладчиком нужно как-то взаимодействовать: через текстовый или графический интерфейс. В "оболочке" программы с хорошо отлаженным ядром может оказаться неприятный баг, и пользователю это вряд ли понравится. Любому разработчику не хотелось бы допускать такой ситуации.
WorkStarter: утилита для автоматизации запуска программ при старте Windows

Привет, Хабр! 👋 Хочу поделиться небольшим проектом, который я разработал для решения личной задачи. Возможно, кому-то он тоже пригодится.
Что это такое?
WorkStarter - это простая утилита для Windows, которая позволяет автоматически запускать программы и открывать веб-сайты при старте компьютера. Основная идея заключается в том, чтобы упростить процесс подготовки рабочего окружения после включения ПК.
Основные возможности
- 🖥️ Автоматический запуск программ
- 🌐 Открытие веб-сайтов
- ⏱️ Настройка задержки для каждой задачи
- 🎨 Графический интерфейс для управления задачами
- 🔧 Хранение конфигурации в JSON-формате
Как это работает?
WorkStarter состоит из двух основных компонентов:
1. WorkStarter Configuration - графический интерфейс для настройки задач.
2. WorkStarterAgent - фоновый процесс, который запускается при старте системы и выполняет настроенные задачи.
Конфигурация хранится в файле config.json в пользовательской директории приложения.
Технические детали
Проект написан на Python с использованием следующих библиотек:
- PyQt6 для создания графического интерфейса
- asyncio для асинхронного выполнения задач
- appdirs для управления директориями приложения
Установка и использование
1. ⬇️ Скачайте последнюю версию WorkStarter
2. Запустите установщик и следуйте инструкциям
3. После установки запустите "WorkStarter Configuration" из меню "Пуск"
4. Добавьте нужные задачи через графический интерфейс
5. WorkStarterAgent будет автоматически запускаться при старте системы
Ограничения и планы на будущее
На данный момент утилита работает только на Windows и имеет ограниченный функционал. В будущем планируется:
Qt-шные прокси-модели и их друзья

Разрабатывая приложения на Qt или PyQt/PySide2 вы рано или поздно столкнетесь с необходимостью создания собственной реализации QAbstractItemModel и/или QAbstractProxyModel. Я хочу рассказать про одну конкретную проблему, с которой я столкнулся, разрабатывая прокси-модель с возможностью группировки объектов дерева.
Рабочая C++ IDE в docker container

Привет, хабр! Программирую на C++ / Qt / QML в среде разработки QtCreator уже 6-ой год. У меня есть определенные пересечения мыслей с мозгом груга и еще мне постоянно хочется избавиться от глупой и рутинной работы, которая есть на разных этапах разработки. Одна из таких работ - возня с IDE и рабочим окружением, особенно в мире C++ разработки. В статье постараюсь раскрыть проблему и описать свой текущий подход к решению.
Мини-гайд по стилям в Qt (PySide6)

Здравствуйте, уважаемые Хабрчане и гости!
Так как моя первая статья была опубликована и получила хоть какой-то положительный отклик, решил сделать еще одну статью, которую давно хотел написать.
В данной статье пойдет речь о стилях в Qt, конкретно я буду использовать для примера PySide6.
Опять же, статья не претендует на звание супер-туториала, а скорее носит характер некого «небольшого справочника» или «мини-гайда» для тех, кто хочет приукрасить свое приложение на Qt. Тем более я не pro в CSS, и делаю на пробу, эксперементрую.
В качестве примера возьму несколько виджетов, и постараюсь схематично наглядно показать, как некоторые строки из QSS (CSS для Qt) могут преобразить виджет.
В документации по Qt приводятся некоторые примеры, но я решил немного прочитать и в других источниках, и сделать наглядный пример.
Есть несколько способов, как можно применить стили к своему приложению (которые я знаю):
Делаем простой рисовальщик в PySide6

Здравствуйте, уважаемые Хабравчане и гости!
Это моя первая статья на Хабре. Она не претендует на какой-либо уровень, а предназначена в первую очередь для тех, кто так же, как и я до написания этой статьи, находится в поиске решения проблемы рисования в PySide6.
Дело в том, что для своего пет-проекта мне нужна была рисовалка на минималке, но при этом, должна иметь базовый функционал, от нее не требуется быть полноценным графическим редактором. Что нужно было:
QML: отличие оператора ":" Qt.binding от Binding
В чём отличие ":" от Binding? Изучаем тонкости присваивания значений переменным в QML. Небольшая заметка, которая поможет вам сделать код понятней, и избавит вас от неожиданного поведения вашей программы.
Отправляем Qt-логи с метками в Sentry

Привет всем.
Я давно занимаюсь разработкой десктопных приложений с использованием Qt и уже наработал некоторые подходы по работе с логами. В данной статье я бы хотел поделиться с сообществом этими подходами, они могут пригодиться в разных ситуациях.
Шейдерный осциллограф в 140FPS или как обойти невозможность передать огромный массив переменных из C++ в QML/Shader

Доброго времени суток всем хабровчанам!
Как-то пришлось работать с медленным промышленным ARM с кастомным линуксом на борту. Было там одно слабое ядро и 512 мегабайт оперативной памяти, которая выделялась на низком уровне частично для видеопамяти. Был там полностью огромный графический интерфейс на QML, внутри которого был и осциллограф. В то время он был реализован на QChart
, и показывал максимум 20 FPS, поскольку рисовался полностью слабым процессором. Мне это жутко не нравилось. Я привык видеть глазами минимум 60 FPS, так что я серьёзно занялся этой проблемой.
Ближайшие события





Тысяча и одна библиотека С++

В жизни каждого программиста С++ рано или поздно возникает задача, которую кто-либо уже решил. Однако найти это решение бывает очень непросто в силу разных причин: оно недостаточно разрекламировано, либо имеет нечеткую документацию, или возникает проблема языкового барьера, ну, или поисковики просто плохо ищут).
Столкнувшись много раз подряд с тем, что найти что-то толковое довольно непросто, я решил попробовать распутать это узел и предложить для русскоязычных читателей свой справочник классных библиотек на С++. Я исходил из этого источника. Это очень многогранный и объемный список библиотек языка С++, но, скажем так, у меня были к нему вопросы. Потому я сделал перевод, затем значительно улучшил его в плане содержания (далее объясню, как, почему и зачем). На выходе получилось около 1000 библиотек. Как в сказке). Они, конечно, не покрывают все возможные задачи и предметные области, но поверьте, они затрагивают действительно многое.
PUSSY – швейцарский нож от мира ПО. Погружаемся в систему Свойств #ШБР2

PUSSY (Python Utilitarian Script System for You) - это кроссплатформенный программный комплекс, который позволяет ускорить разработку приложений с графическим интерфейсом на языке Python и PySide6. Его ключевой фичей является быстрое создание раздела с пользовательскими настройками, достаточно просто объявить перечень Свойств в Специальном контейнера, а система сама позаботится обо всем остальном. Нажимайте на "Читать далее" чтобы узнать как с этим работать и как можно самостоятельно расширить его возможности под собственные потребности...
Небольшая доработка QMap в Qt
Решаем одну старую проблему с QMap. Есть многоуровневый QVariantMap, то есть один вложен в другой и так много раз. И надо иметь возможность изменять в любом месте иерархии ключ/значение.
Штатные возможности Qt 4 не предусматривают изменение части дерева, только полная перезапись целиком всей ветки дерева (в Qt5,6 не знаю).
Но у нас появилась реализация, выносим на ваш суд и делимся результатами.
Разработка интерфейса для Windows — это боль

Последние несколько дней я пытался найти библиотеку, которая бы позволила мне писать на C++ программы с GUI. Мои требования были довольно просты:
• Достаточно только поддержки Windows
• Разрешено коммерческое использование
• Простая стилизация, в том числе и тёмный режим
• Результатом должен быть единый файл .exe
размером меньше 40 МБ без или с минимальным количеством зависимостей
• Написание части программы с GUI не должно занимать больше времени, чем сама функциональность
И снова клон десктопного клиента Telegram

Казалось бы, сколько их уже есть, зачем еще один? Но случилось совпадение многих вещей - у меня было свободное время, желание что-то сделать, неудовлетворенность работой официального клиента и нежелание изучать существующие альтернативные версии и перечень их отличий. В результате я реализовал свой Луна-парк, с нужными мне фичами. Подробнее под катом.
Python logging — вывод лога на QTextWidget (PyQt6)

Было консольное Python приложение, в котором пишутся логи через стандартный модуль logging. Затем прикрутил GUI на PyQt6, конечно, хочется продублировать логи в какой-нибудь виджет в уголочке. Категорически не хочется ничего менять в консольной части, и спокойно использовать дальше стандартный logging.
В этом посте будет рассмотрено два примера. Простой - виджет, который дублировал бы вывод стандартного Python логгера. Усложнение - имеется несколько потоков, они тоже пишут логи. Нужно их логи тоже увидеть на виджете, но он в родительской части, а потоки не могут напрямую в него писать - получим сегфолт.
Засады многопоточности
В данной статье я опишу свои самые свежие и яркие впечатления от многопоточного программирования. Это мои впечатления, мой опыт и я буду рад, если он будет полезен другим программистам.
В крайней статье я утверждал, что более серьезные проблемы их поджидают в случае взаимодействующих потоков. Но одно эти проблемы предполагать или даже предсказывать, а другое - столкнуться с ними непосредственно.
Предсказанное сбылось, как говорится, по полной программе. Думаю, что озвученные далее проблемы для кого-то не станут новостью, но будут и те, кто о них не подозревает, как не подозревал и я. А потому захотелось их зафиксировать и поделиться, с чем пришлось столкнуться. Ну, и рассказать, как я выкрутился, попав в не совсем привычные для меня ситуации (в автоматном программировании, подчеркну, они не возникли бы в принципе).
Итак, создав ранее тест потоков (о нем подробнее см. [1]), гоняя его многократно и в разных режимах, я заметил, что пусть редко, но выскакивают некорректные результаты. В подобных случаях я грешу обычно на себя. А в данном случае тем более, т.к., что там скрывать, имею весьма небольшой опыт использования потоков.
Но в процессе экспериментов обнажились проблемы, которые сложно списать на недостаток опыты. Что-то при этом удалось преодолеть сразу, с чем-то пришлось повозиться, но были и те проблемы, которые не удалось поправить, даже при наличии достаточно большого опыте в программировании вообще. О последнем, не об опыте, конечно, а о проблемах, и пойдет далее речь... И даже не о проблемах, а о довольно нежданных и негаданных "засадах", возникших на пути освоения многопоточности.
Вклад авторов
Gorthauer87 587.0Assuri 470.0vitaly_KF 331.2Vass 330.0tass 303.0BlackRaven86 275.0rule 242.6FRUCT 239.0Andrey2008 228.0