Qt (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Qt. Дата последней синхронизации: 23 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Qt — кроссплатформенный набор инструментов и виджетов для создания приложений, который использует стандартный язык программирования C++, а также специальный генератор кода (Meta Object Compiler, или moc) вместе с набором макросов, расширяющих возможности языка. Набор предоставляет широкие возможности по разработке приложений. Среди наиболее важных:

  • Работа на основных компьютерных платформах и операционных системах, а также на некоторых мобильных платформах.
  • Обширная поддержка возможностей интернационализации.
  • Полнофункциональная библиотека с поддержкой SQL баз данных, парсинга XML, управления потоками, сети и унифицированный кроссплатформенный программный интерфейс (API) для работы с файлами.

На основе фреймворка Qt развивается сообщество и программное обеспечение KDE. Qt лежит в основе других важных проприетарных и открытых программных проектов, таких как VLC, VirtualBox, Mathematica и многих других.

Установка

Qt 6.x и 5.x доступны в официальных репозиториях. Старые версии (4.x и 3.x) есть в AUR. Их можно установить с помощью следующих пакетов:

  • Qt 6.x входит в пакет qt6-base, документация — qt6-doc.
  • Qt 5.x входит в пакет qt5-base, документация — qt5-doc.
  • Qt 4.x предоставляется пакетом qt4AUR, документация — qt4-docAUR.
  • Qt 3.x можно установить из AUR с пакетом qt3AUR, документация — qt3-docAUR.

Выбор набора Qt по умолчанию

С помощью qtchooserAUR, вы можете выбирать, для какой версии Qt будут помещены исполняемые файлы (например, qmake) в /usr/bin. По умолчанию используется Qt5 (например, qmake-qt5).

Важно: Сейчас qtchooserAUR конфликтует с qt5-base. Вы можете попытаться установить его в /usr/local, но официально это не поддерживается. Смотрите FS#51308.

Используя переменные окружения

Чтобы выбрать конкретный набор Qt, вы можете создать переменную окружения QT_SELECT. Например, чтобы выбрать Qt4, добавьте export QT_SELECT=4 в файл инициализации вашей командной оболочки (например, ~/.bash_profile или ~/.zsh_profile).

Используя файл конфигурации

Вы можете выбрать версию набора Qt по умолчанию, создав символическую ссылку ~/.config/qtchooser/default.conf на один из файлов .conf в каталоге /etc/xdg/qtchooser. Например, чтобы выбрать Qt4, создайте ссылку на /etc/xdg/qtchooser/4.conf:

$ ln -s /etc/xdg/qtchooser/4.conf ~/.config/qtchooser/default.conf

Внешний вид

Qt5

Qt5 выбирает стиль, основываясь на текущей среде рабочего стола:

  • В KDE Plasma он использует текущий выбранный стиль Qt. Это можно настроить через Параметры системы (systemsettings), раздел Внешний вид > Оформление приложений.
  • Для Cinnamon, GNOME, MATE, LXDE, Xfce он использует GTK (QGtkStyle).
  • В других средах рабочего стола используется Fusion.

Если вы хотите принудительно установить внешний вид и поведение интерфейса приложений Qt5, установите переменную окружения QT_STYLE_OVERRIDE с названием желаемого стиля. В частности, для GTK пропишите gtk2 (не забудьте установить плагины, требуемые для нужного вам стиля). Приложения Qt5 также поддерживают опцию -style.

В состав Qt5 входят стили Fusion и Windows. В официальных репозиториях и AUR доступны дополнительные стили:

  • Breeze — Стиль Plasma Desktop.
https://invent.kde.org/plasma/breeze || breeze
  • Oxygen — Стиль KDE Oxygen.
https://invent.kde.org/plasma/oxygen || oxygen
  • Lightly — Форк Breeze, который стремится выглядеть современно и минималистично.
https://github.com/Luwx/Lightly || lightly-gitAUR
  • QtCurve — Гибкая в настройке тема рабочего стола с поддержкой приложений GTK и Qt.
https://invent.kde.org/system/qtcurve || qtcurve-qt5
  • Adwaita-Qt — Стиль для Qt-приложений, выглядящий как GNOME Shell.
https://github.com/MartinBriza/adwaita-qt || adwaita-qt5
  • Qt style plugins — Дополнительные плагины для Qt5: GTK, Cleanlooks, Motif, Plastique.
https://code.qt.io/cgit/qt/qtstyleplugins.git || qt5-stylepluginsAUR
  • Kvantum — Настраиваемый, основанный на SVG движок тем с множеством встроенных стилей. Также включает в себя имитацию некоторых популярных тем GTK: Adapta, Arc, Ambiance
https://github.com/tsujan/Kvantum/tree/master/Kvantum || kvantum

Qt4

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

  • В KDE Plasma он использует текущий выбранный стиль Qt. Это можно настроить через Параметры системы (systemsettings), раздел Внешний вид > Оформление приложений.
  • Для Cinnamon, GNOME, Xfce он использует GTK (QGtkStyle).
  • В других средах рабочего стола используется Windows.

Для тех, кто хочет изменить внешний вид и оформление приложений Qt4, в пакете qt4AUR есть инструмент графического интерфейса QQt Configuration (qtconfig-qt4). Он предлагает простой интерфейс для настройки внешнего вида приложений Qt4, включая стиль, цвета, шрифты и некоторые другие параметры.

Примечание: При использвании стиля GTK настройки цветов и шрифтов игнорируются и берутся из GTK 2.

Qt хранит все свои настройки в файле /etc/xdg/Trolltech.conf (общесистемный) или ~/.config/Trolltech.conf (пользовательский). В этом файле довольно сложно ориентироваться, так как он содержит много информации, не относящейся к внешнему виду, но для любых изменений вы можете просто добавить в конец файла и таким образом перезаписать все предыдущие значения (убедитесь, что добавляете свои изменения в секцию [Qt]).

Например, чтобы изменить тему на QtCurve, добавьте:

~/.config/Trolltech.conf
...
[Qt]
style=QtCurve

В состав Qt4 входят стили CDE, Cleanlooks, GTK, Motif, Plastique, Windows. В официальных репозиториях и AUR доступны дополнительные стили:

  • Breeze — Стиль Plasma Desktop.
https://invent.kde.org/plasma/breeze || breeze-kde4AUR
  • Adwaita-Qt — Стиль для Qt-приложений, выглядящий как GNOME Shell.
https://github.com/MartinBriza/adwaita-qt || adwaita-qt4AUR

Таблицы стилей Qt

Интересным способом модификации внешнего вида приложений Qt является использование таблиц стилей, которые представляют собой обычные CSS-файлы. Используя таблицы стилей, пользователь может изменить внешний вид любого виджета в приложении.

Чтобы запустить приложение, используя указанную таблицу стилей, просто передайте путь к файлу в опции -stylesheet:

$ qt_приложение -stylesheet стиль.qss

Для получения подробной информации о таблицах стилей Qt смотрите официальную документацию или руководство. Пример таблицы стилей вы можете найти на этой странице.

GTK и Qt

Если вы используете одновременно приложения GTK+ и Qt, их внешний вид может несколько различаться. Если вы хотите, чтобы стили отображения в точности соответствовали друг другу, смотрите статью Единый вид приложений GTK и Qt.

Настройка приложений Qt5 в окружениях, отличных от KDE Plasma

В отличие от Qt4, Qt5 не поставляет утилиту qtconfig для настройки шрифтов, значков или стилей. Вместо этого он попытается использовать настройки из запущенной среды рабочего стола. В KDE Plasma или GNOME это работает хорошо, но в других менее популярных средах рабочего стола или оконных менеджерах это может привести к отсутствию значков в приложениях Qt5. Один из способов решения этой проблемы — подделать информацию о среде рабочего стола, прописав переменную окружения XDG_CURRENT_DESKTOP=KDE или GNOME, а затем использовать соответствующее приложение конфигурации для выбора нужного набора значков.

Другим решением является использование qt5ct, который предоставляет Qt5 QPA, не зависящий от среды рабочего стола, и утилиту настройки. После установки запустите qt5ct и настройте стили, а затем пропишите переменную окружения QT_QPA_PLATFORMTHEME=qt5ct, чтобы эти настройки стали применяться приложениями Qt. Также можно использовать опцию --platformtheme qt5ct при запуске приложения Qt5.

qt5ct-kdeAUR имеет более хорошую интеграцию с приложениями KDE, в том числе KDE QML.

Если некоторые значки отсутствуют и вы видите такие ошибки:

Icon theme "oxygen" not found.
Icon theme "oxygen" not found.
Error: standard icon theme "oxygen" not found!

то установите oxygen и oxygen-icons.

Разработка

Поддержка платформ

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

Инструменты

Список официальных инструментов разработки для Qt:

  • Qt Creator — Кроссплатформенная среда разработки, созданная для разработки приложений Qt.
https://doc.qt.io/qtcreator/ || qtcreator
  • Qt Linguist — Набор инструментов для упрощения перевода и интернационализации приложений Qt.
https://doc.qt.io/qt-5/qtlinguist-index.html || qt4AUR
  • Qt Assistant — Справочная система для чтения документации по Qt.
https://doc.qt.io/qt-5/qtassistant-index.html || Qt 5: qt5-tools, Qt 4: qt4AUR
  • Qt Designer — Инструмент для разметки графического интерфейса приложений Qt и создания форм для виджетов.
https://doc.qt.io/qt-5/qtdesigner-manual.html || Qt 5: qt5-tools, Qt 4: qt4AUR
  • Qt Quick Designer — Визуальный редактор файлов QML, поддерживающий режим WYSIWYG. Он позволяет с нуля проектировать и разрабатывать приложения и компоненты Qt Quick.
https://doc.qt.io/qtcreator/creator-using-qt-quick-designer.html[устаревшая ссылка 2022-09-22] || qtcreator
  • qmlscene — Инструмент для загрузки документов QML, облегчающий разработку и отладку приложений QML.
https://doc.qt.io/qt-5/qtquick-qmlscene.html || Qt 5: qt5-declarative, Qt 4 QML Viewer: qt4AUR
  • qmake — Средство автоматизации процесса сборки приложений Qt на различных платформах, похожее на cmake, но с меньшим количеством опции и ориентированное на приложения Qt.
https://doc.qt.io/qt-5/qmake-manual.html || Qt 5: qt5-base, Qt 4: qt4AUR
  • uic — Генератор кода C++ на основе .ui-файлов.
https://doc.qt.io/qt-5/uic.html || Qt 5: qt5-base, Qt 4: qt4AUR
  • rcc — Инструмент для упаковки ресурсов (например, изображений) в приложение при сборке. По сути генерирует код на C++, содержащий данные, указанные в файле ресурсов (.qrc).
https://doc.qt.io/qt-5/rcc.html || Qt 5: qt5-base, Qt 4: qt4AUR
  • moc — Препроцессор исходных файлов, обрабатывающий расширения Qt для C++ (например, директивы механизма сигналов и слотов, RTTI, аннотации).
https://doc.qt.io/qt-5/moc.html || Qt 5: qt5-base, Qt 4: qt4AUR

Другие языки программирования

Qt имеет привязки ко многим популярным языкам программирования. Полный список поддерживаемых языков вы можете найти на странице https://wiki.qt.io/Language_Bindings

Приведенные ниже примеры отображают окно с сообщением 'Hello world!'.

C++

  • Пакет: qt5-base
  • Сайт: https://www.qt.io/developers/
  • Команда сборки: g++ $(pkg-config --cflags --libs Qt5Widgets) -fPIC -o hello hello.cpp
  • Команда запуска: ./hello
hello.cpp
#include <QApplication>
#include <QLabel>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QLabel hello("Hello world!");

    hello.show();
    return app.exec();
}

QML

hello.qml
import QtQuick 2.3

Rectangle {
    id: page
    width: 400; height: 100
    color: "lightgray"

    Text {
        id: helloText
        text: "Hello world!"
        anchors.horizontalCenter: page.horizontalCenter
        anchors.verticalCenter: page.verticalCenter
        font.pointSize: 24; font.bold: true
    }
}

Python (PyQt)

hello-pyqt.py
import sys
from PyQt5 import QtWidgets

app = QtWidgets.QApplication(sys.argv)
label = QtWidgets.QLabel("Hello world!")

label.show()
sys.exit(app.exec_())

Python (PySide2)

hello-pyside2.py
import sys
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
label = QLabel("Hello world!")

label.show()
sys.exit(app.exec_())

C#

Смотрите QtSharp.

Решение проблем

Настройка журнала Qt

При использовании KDE и/или любой другой среды рабочего стола на основе Qt в журнал systemd может записываться много отладочной информации.

Изменить поведение можно с помощью переменной окружения QT_LOGGING_RULES. Например, чтобы полностью отключить запись в журнал:

/etc/environment
QT_LOGGING_RULES='*=false'

Чтобы отключить только отладочные записи, используйте QT_LOGGING_RULES="*.debug=false".

Не применяется тема значков

Начиная с Qt 5.1, поддержка SVG переместилась в модуль. Поскольку qt5-base не зависит от qt5-svg, может случиться так, что qt5-base установлен, а qt5-svg нет. Так как SVG по умолчанию не поддерживается, значки молча пропускаются, и может показаться, что тема иконок не используется. Явная установка qt5-svg решает проблему.

Не применяется тема для приложений, запущенных от имени root

Поскольку файл темы пользователя ($XDG_CONFIG_HOME/Trolltech.conf) не читается другими аккаунтами, выбранная тема не будет применяться к приложениям X, запущенным от имени root. Возможные решения:

  • Создать символические ссылки, например
    # ln -s /home/пользователь/.config/Trolltech.conf /etc/xdg/Trolltech.conf
  • Настроить тему в общесистемном файле: /etc/xdg/Trolltech.conf
  • Настроить тему пользователя root

Не учитывается стиль Qt 4

Если чистые приложения Qt4 (не KDE) не придерживаются выбранного вами стиля Qt4, то вам, вероятно, придется указать Qt4, как найти стили KDE (Oxygen, Phase и т.д.). Вам просто нужно установить переменную окружения QT_PLUGIN_PATH. Например:

QT_PLUGIN_PATH=$HOME/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/

После этого qtconfig-qt4 сможет найти ваши стили KDE, и всё снова будет выглядеть красиво!

Также можно создать символическую ссылку из каталога стилей QT4 в каталог стилей KDE4:

# ln -s /usr/lib/{kde,qt}4/plugins/styles/название_темы

Все приложения Qt5 перестали запускаться после обновления Qt5

Если вы видите такую ошибку:

Qt FATAL: Cannot mix incompatible Qt library (version 0x50900) with this library (version 0x50901)

то, скорее всего, вы используете стороннюю платформу тем Qt5 или плагин стиля, который не был перекомпилирован под последнюю версию Qt5. Они обычно используют приватные заголовки Qt, что означает, что они зависят от точной версии Qt, а не только от совпадающего soname. Выясните, какую тему/стиль вы используете, проверив переменные окружения QT_STYLE_OVERRIDE и QT_QPA_PLATFORMTHEME, и пересоберите соответствующий пакет AUR.

QXcbConnection: XCB error: 2 (BadValue)

Создайте следующий файл [1]:

/etc/xdg/QtProject/qtlogging.ini
[Rules]
qt.qpa.xcb.xcberror=false

Неправильное выравнивание или масштабирование графики

Смотрите HiDPI#Qt 5.

Смотрите также