Аналог Microsoft Paint (вид современной версии из Windows 11) на C++ и Qt 6. Нативное приложение: собирается в один исполняемый файл, без питона и рантаймов.
Нужны компилятор с поддержкой C++17, CMake ≥ 3.16 и Qt 6 (модули Widgets и PrintSupport).
Debian / Ubuntu / Mint
sudo apt install build-essential cmake qt6-base-dev libqt6printsupport6 qt6-base-dev-toolsFedora
sudo dnf install gcc-c++ cmake qt6-qtbase-develArch / Manjaro
sudo pacman -S base-devel cmake qt6-baseopenSUSE
sudo zypper install gcc-c++ cmake qt6-base-develЗатем:
cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build -j$(nproc)./build/linux-paintУстановка в систему (появится в меню приложений):
sudo cmake --install buildДополнительно нужен dpkg-dev — из него берётся расчёт зависимостей:
sudo apt install dpkg-devСобрать пакет из готовой сборки:
cd build && cpack -G DEBПолучится linux-paint_1.0.0_amd64.deb. Установка:
sudo apt install ./linux-paint_1.0.0_amd64.debПосле этого LinuxPaint появится в меню приложений со своим значком, а изображения можно будет открывать через «Открыть с помощью». Удаление:
sudo apt remove linux-paintВажно: .deb связан с той версией Qt, что стояла на машине сборки. Пакет,
собранный на системе с Qt 6.10, не запустится там, где Qt 6.4. Поэтому пакет
собирают на том же дистрибутиве, где он будет ставиться, — либо используют
AppImage.
Один файл, работающий на любом дистрибутиве: библиотеки Qt лежат внутри него, поэтому системная версия Qt значения не имеет.
cmake --build build --target appimageИнструменты сборки скачиваются автоматически при первом запуске. Результат —
build/LinuxPaint-x86_64.AppImage, около 50 МБ. Запуск:
chmod +x LinuxPaint-x86_64.AppImage && ./LinuxPaint-x86_64.AppImageСобирать AppImage следует на старом дистрибутиве (обычно Ubuntu 22.04): файл потянет за собой системную библиотеку C той машины, где собран, и на более старых системах уже не запустится. Обратная совместимость работает только в одну сторону.
Проще всего сделать это в контейнере, не заводя отдельную машину:
sudo docker run --rm -v $PWD:/src -w /src ubuntu:22.04 bash -c "apt update && apt install -y build-essential cmake qt6-base-dev qt6-base-dev-tools libqt6svg6 libgl1-mesa-dev libvulkan-dev libxkbcommon-dev wget file && (apt install -y qt6-svg-plugins || true) && cmake -S . -B /tmp/b -DCMAKE_BUILD_TYPE=Release && cmake --build /tmp/b --target appimage -j\$(nproc) && cp /tmp/b/LinuxPaint-x86_64.AppImage /src/"Два пакета в этом списке нужны по неочевидным причинам.
libgl1-mesa-dev и соседи: на Ubuntu 22.04 пакет qt6-base-dev не тянет
заголовки OpenGL, и без них CMake не находит Qt6Gui, а следом Widgets
и PrintSupport — хотя файлы настройки этих модулей лежат на месте и
сообщение об ошибке выглядит загадочно.
libqt6svg6: логотип вшит в программу текстом SVG, и превращает его в
картинку отдельный модуль Qt. В AppImage он укладывается явно (см.
EXTRA_QT_PLUGINS в packaging/appimage.cmake), но взять его сборщику
неоткуда, если модуль не установлен в самой системе сборки.
Инструменты — карандаш, заливка с настраиваемым допуском (насколько близкие оттенки считать одной областью), текст, ластик (правой кнопкой работает как «цветной ластик»: заменяет только Цвет 1), пипетка, лупа.
Текст — набирается прямо на холсте, с курсором, выделением и переносом строк. Пока идёт набор, в ленте появляется группа «Текст»: шрифт, кегль, полужирный, курсив, подчёркивание и непрозрачная подложка Цветом 2. Текст остаётся редактируемым, пока не кликнуть мимо рамки.
Кисти — обычная, каллиграфические 1 и 2, аэрограф (продолжает распылять при удержании кнопки), масляная, мелок, маркер, карандаш, акварель. Каждая кисть имеет собственную фактуру, а не просто разную толщину.
Толщина и прозрачность задаются двумя вертикальными ползунками слева от холста. Прозрачность честная: штрих сначала целиком копится в отдельном слое и лишь потом ложится на холст, поэтому самоперекрытия внутри одного мазка не уплотняют цвет — полупрозрачная линия остаётся равномерной. Действует на карандаш, кисти и фигуры (контур и заливка ложатся одной фигурой).
Фигуры — линия, кривая Безье с двумя изгибами, овал, прямоугольник, скруглённый прямоугольник, многоугольник, треугольники, ромб, пяти- и шестиугольник, четыре стрелки, звёзды на 4/5/6 лучей, три выноски (включая облако), сердце, молния. После отпускания мыши фигура остаётся редактируемой: её можно двигать и тянуть за восемь маркеров, пока она не зафиксирована (Enter, клик мимо или смена инструмента). Контур и заливка независимо переключаются между сплошным цветом и фактурами мелка, маркера, масла, карандаша и акварели.
Выделение — прямоугольное и произвольное, перемещение, масштабирование за маркеры, вырезание, копирование, вставка (в том числе из файла), удаление, обрезка по выделению, обратить выделение, прозрачное выделение (Цвет 2 становится прозрачным), повороты и отражения только выделенной области.
Слои — панель справа (кнопка «Слои» в ленте или Ctrl+L): добавление,
дублирование, удаление, перемещение по стопке, объединение с нижним и
включение видимости. Инструменты рисуют в активный слой, на экран и в файл
идёт склейка видимых. Прозрачные места показываются шахматкой. Слои живут
только в текущем сеансе: обычные растровые форматы их не хранят, при
сохранении картинка сводится в одно изображение.
Изображение — изменение размера в процентах или пикселях с сохранением пропорций, наклон по обеим осям, повороты на 90/180/270°, отражения, обращение цветов, свойства холста в пикселях, сантиметрах или дюймах. Размер холста меняется и мышью — за маркеры на правом и нижнем краях листа.
Файлы — PNG, JPEG, BMP, GIF, TIFF, WebP и всё остальное, что поддерживает сборка Qt. Есть печать, список последних файлов, открытие перетаскиванием.
Вид — масштаб от 12,5 % до 3200 % (ползунок в строке состояния, Ctrl+колесо удерживает точку под курсором), линейки, попиксельная сетка на крупном масштабе, полноэкранный режим, светлая и тёмная темы.
| Клавиши | Действие |
|---|---|
Ctrl+N / Ctrl+O / Ctrl+S |
Создать / открыть / сохранить |
Ctrl+Shift+S / Ctrl+P |
Сохранить как / печать |
Ctrl+Z / Ctrl+Y |
Отменить / вернуть |
Ctrl+X / Ctrl+C / Ctrl+V |
Вырезать / копировать / вставить |
Ctrl+A / Ctrl+Shift+A |
Выделить всё / обратить выделение |
Ctrl+Shift+X / Ctrl+W |
Обрезать / изменить размер и наклон |
Ctrl+Shift+I / Ctrl+Shift+N |
Обратить цвета / очистить холст |
Ctrl++ / Ctrl+- / Ctrl+0 / Ctrl+9 |
Масштаб: больше, меньше, 100 %, по окну |
Ctrl+R / Ctrl+G / F11 |
Линейки / сетка / во весь экран |
P B F T E K M S |
Карандаш, кисть, заливка, текст, ластик, пипетка, лупа, выделение |
Esc / Enter |
Отменить / зафиксировать построение |
| Стрелки | Сдвинуть выделение на пиксель (с Ctrl — на 10) |
Во всех инструментах левая кнопка мыши рисует Цветом 1, правая — Цветом 2.
Shift держит линию под углом, кратным 45°, а прочие фигуры делает
правильными (круг, квадрат).
| Файл | Назначение |
|---|---|
src/Document.* |
Изображение, история отмен, операции над холстом, заливка |
src/Canvas.* |
Виджет холста: масштаб, выделение, ввод мышью |
src/tools/Tool.* |
Базовый инструмент и общая механика штрихов и фактур |
src/tools/PaintTools.* |
Карандаш, кисти, ластик, заливка, пипетка, лупа |
src/tools/ShapeTool.* |
Фигуры и их редактирование маркерами |
src/tools/SelectTool.* |
Прямоугольное и произвольное выделение |
src/tools/TextTool.* |
Ввод текста поверх холста |
src/Ribbon.*, src/ColorArea.* |
Лента, галереи, палитра |
src/Icons.* |
Значки, рисуемые кодом (бинарных ресурсов в проекте нет) |
src/Theme.* |
Светлое и тёмное оформление |
src/MainWindow.* |
Сборка окна, меню, действия, линейки, строка состояния |
GNU General Public License, версия 3 или новее — полный текст в файле LICENSE. Брать код можно кому угодно и на что угодно, но с двумя условиями.
Исходники производной работы должны быть открыты под той же лицензией. Это суть GPL: программа остаётся свободной у всех, кто её продолжит.
Изменённые сборки должны быть помечены как изменённые и не выдаваться за официальные. Это дополнительное условие по разделу 7(c) лицензии; имена InoMotion и LinuxPaint и логотип проекта на изменённые версии не распространяются. Форкать можно свободно — просто дай форку своё имя.
Значки взяты из набора Fluent UI System Icons корпорации Microsoft под лицензией MIT. Её текст и остальные сторонние составляющие — в файле NOTICE.