Qt
Qt 是一个跨平台的应用程序和图形组件工具包,它使用标准C++,但同时对C++作出了功能拓展,通过使用特别的代码生成器(称为 Meta Object Compiler ,元对象编译器,简称 moc )以及数个宏来扩展语言的功能。它还包括以下几个更重要的特性:
- 支持各种主流桌面平台和部分手机平台。
- 完善的国际化支持。
- 提供 SQL 数据访问、XML 解析、线程管理、网络支持和统一的跨平台的文件处理API。
Qt 框架是 KDE 软件社区和其它一些重要开源和闭源应用的基石,例如 VLC、VirtualBox、Mathematica 等等。
安装[编辑 | 编辑源代码]
可以从官方仓库安装 Qt 6.x 和 5.x 。旧版本的Qt (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:软件包 qt3AUR,文档包 qt3-docAUR。
默认 Qt 库[编辑 | 编辑源代码]
安装 qtchooserAUR 可以改变 /usr/bin
Qt二进制文件(例如, qmake )的指向(它们默认指向Qt5版本的程序,例如 qmake-qt5 ),让它们指向旧版本的程序(例如,qmake-qt4 或者 qmake-qt3 )。
修改环境变量[编辑 | 编辑源代码]
可以通过 QT_SELECT
环境变量设置默认的 QT. 例如要使用 Qt4,可以设置 export QT_SELECT=4
。
使用配置文件[编辑 | 编辑源代码]
创建 ~/.config/qtchooser/default.conf
软链接,链接到/etc/xdg/qtchooser/
目录中需要的 .conf 文件上。例如要使用 Qt4,将 /etc/xdg/qtchooser/4.conf
软链接到 ~/.config/qtchooser/default.conf
。
$ ln -s/etc/xdg/qtchooser/4.conf
~/.config/qtchooser/default.conf
配置[编辑 | 编辑源代码]
Qt5 样式[编辑 | 编辑源代码]
Qt5基于当前使用的桌面环境来决定所使用的样式:
- 在 KDE Plasma 桌面环境中,呈现实际选择的Qt风格。可以在 KDE System Settings ( systemsettings )中更改,这项设置的具体位置是外观 > 应用程序风格。
- 在 Cinnamon、GNOME、MATE、LXDE、Xfce 等桌面环境中,呈现GTK风格 (QGtkStyle)。
- 在其他桌面环境中,呈现 Fusion 风格。
如果要强制指定一种样式,你可以设置 QT_STYLE_OVERRIDE
环境变量。特别的,如果你想要使用GTK主题,把它设置成gtk2
(注意:你将需要安装在下文中提到的Qt样式插件来获取GTK样式)。Qt5应用同时也支持-style
标志,你可以用它来使用指定的样式运行一个Qt5应用程序。
Qt5中自带两种样式: Fusion、Windows。其他的可以通过官方仓库安装:
- Breeze — 来自Plasma桌面的Breeze视觉样式,包括了绘画、样式和素材。
- Oxygen — KDE 的 Oxygen 轻氧风格。
- Lightly — Lightly是breeze主题的fork,它致力于现代风和极简风格。
- QtCurve — 为KDE和Gtk编写的可配置的小部件样式。
- Adwaita-Qt — 让Qt应用程序看上去有GNOME风格。
- Qt style plugins — Qt 5的附加样式,包含了 GTK、Cleanlooks、Motif、 Plastique。
- Kvantum — 可定制的基于 SVG 的主题引擎,具有多种内置样式,包括对一些流行的 GTK 主题的模仿,例如 Adapta、Arc、Ambiance。
Qt4 样式[编辑 | 编辑源代码]
Qt4 应用程序会尝试模仿所运行的桌面环境的行为,除非碰到了某些问题或者进行了强制配置。
- 在 KDE Plasma 桌面环境中,呈现实际选择的Qt风格。可以在 KDE System Settings ( systemsettings )中更改,这项设置的具体位置是外观 > 应用程序风格。
- 在 Cinnamon、GNOME、Xfce 等桌面环境中,呈现GTK风格 (QGtkStyle)。
- 在其他桌面环境中,呈现 Windows 风格。
要修改 Qt4 程序的外观,可以使用 qt4AUR 提供的 Qt 配置工具qtconfig-qt4。这个程序可以配置 Qt4 程序的样式、颜色、字体等。
Qt将所有的配置信息保存在/etc/xdg/Trolltech.conf
(系统级别) 或者 ~/.config/Trolltech.conf
(只适用于特定用户)。这个文件很难浏览,因为它还包含许多与外观无关的信息,但是要更改它,您只需添加到文件末尾并覆盖任何以前的值(注意要把修改添加在[Qt]标题下)。
例如要将主题更改为 QtCurve,请添加:
~/.config/Trolltech.conf
... [Qt] style=QtCurve
Qt4 已经包含数种样式,例如 GTK 样式、Windows 样式、CDE 样式等,其它的主题(大多数为 KDE Plasma 桌面编写)可以从官方源或者 AUR 中安装:
Qt4 自带这些样式: CDE、Cleanlooks、GTK、Motif、Plastique、Windows。其它的主题(大多数为 KDE Plasma 桌面编写)可以单独安装:
- Breeze — 来自Plasma桌面的Breeze视觉样式,包括了绘画、样式和素材。
- Adwaita-Qt — 让Qt应用程序看上去有GNOME风格。
Qt 样式表[编辑 | 编辑源代码]
定制Qt程序的外观有一个有趣的方式,那就是通过Qt样式表,它们只是简单的CSS文件而已。通过样式表,你可以修改程序中所有组件的外观。
想要用不同的风格运行程序,只需要执行:
$ qt_application -stylesheet style.qss
要了解关于Qt样式表的更多信息,请浏览官方文档或者其他的教程。Qt样式表的示例:修改Dolphin的外观。
GTK+ 和 Qt[编辑 | 编辑源代码]
如果你有 GTK 和 Qt 应用程序,它们的外观可能无法融合到一起。如果你希望使 GTK 风格与 Qt 风格匹配,请阅读统一 GTK 和 Qt 应用程序外观.
在KDE Plasma以外的环境下配置Qt5应用程序[编辑 | 编辑源代码]
不像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 提供了一个修改过的 qt5ct,它更好的整合了KDE程序,包括KDE QML 程序。
如果遇到了下列错误,并且一些图标依然不在一些应用程序中出现,安装oxygen包和oxygen-icons包:
Icon theme "oxygen" not found. Icon theme "oxygen" not found. Error: standard icon theme "oxygen" not found!
开发[编辑 | 编辑源代码]
支持的平台[编辑 | 编辑源代码]
Qt支持如今的绝大多数平台,甚至包括一些十分冷门的平台,而且每隔一段时间就会出现更多的移植。更加完整的平台列表请查阅维基百科上的Qt。
Android[编辑 | 编辑源代码]
首先从 AUR 或使用 Android Studio 安装一个 Android SDK 和 NDK。
SDK 也需要 OpenJDK,版本要求也有不同,请查阅这里。
接下来你需要安装Qt 5 for Android。你可以按下面描述的包从 AUR 安装,也可以自行构建。构建需要用到的命令可以从 Qt wiki 找到。
如果遇到了问题,你可以需要查阅已知问题。
- android-armv7a-eabi-qt5AUR - armeabi-v7a
- android-aarch64-qt5AUR - aarch64
- android-x86-qt5AUR - x86
- android-x86-64-qt5AUR - x86_64
或者你也可以使用官方 Qt 安装程序进行安装。
工具[编辑 | 编辑源代码]
以下是官方的Qt工具:
- Qt Creator — 专为Qt设计的跨平台IDE,支持Qt所有的特性。
- Qt Linguist — Qt程序的多语言支持工具集。
- https://doc.qt.io/qt-5/qtlinguist-index.html || Qt 5: qt5-tools包, Qt 4: qt4AUR
- Qt Assistant — 可配置、可再分发的Qt qch 文件阅读器。
- https://doc.qt.io/qt-5/qtassistant-index.html || Qt 5: qt5-tools包, Qt 4: qt4AUR
- Qt Designer — 为Qt Widget程序编写的跨平台GUI设计、窗体构建工具。
- 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
- https://doc.qt.io/qt-5/qmake-manual.html || Qt 5: qt5-base包, Qt 4: qt4AUR
- uic — 读取 *.ui XML文件并且生成相应的C++文件的工具。
- https://doc.qt.io/qt-5/uic.html || Qt 5: qt5-base包, Qt 4: qt4AUR
- rcc — 用于在构建过程中将资源(例如图片)嵌入到Qt应用程序中的工具。它生成包含在 Qt 资源 (.qrc) 文件中指定的数据的 C++ 源文件。
- https://doc.qt.io/qt-5/rcc.html || Qt 5: qt5-base包, Qt 4: qt4AUR
- moc — 用来处理Qt的C++语言功能拓展的工具(例如信号槽技术、运行时类型信息、动态属性系统等等)。
- 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[编辑 | 编辑源代码]
- 包:qt5-declarative包.
- 网站: https://doc.qt.io/qt-5/qtquick-qmlscene.html
- 运行:
qmlscene hello.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)[编辑 | 编辑源代码]
- 包:python-pyqt5包 - Python 3 bindings
- 网站: https://riverbankcomputing.com/software/pyqt/intro
- 运行:
python hello-pyqt.py
.
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)[编辑 | 编辑源代码]
- 包:pyside2包
- 网站: https://wiki.qt.io/Qt_for_Python
- 运行:
python hello-pyside.py
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
) 不被其他的用户读取,你选择的主题不会对 root下运行的X程序生效。以下是几个可能解决方案:
- 创建符号链接,例如
# ln -s /home/[username]/.config/Trolltech.conf /etc/xdg/Trolltech.conf
- 配置系统级别的主题文件:
/etc/xdg/Trolltech.conf
- 将主题调整为root
Qt 4 风格未被考虑[编辑 | 编辑源代码]
如果纯Qt4程序(非KDE程序)不遵循你所选择的Qt4风格,那么你可能需要告诉Qt4如何找到KDE风格(Oxygen等)。只需要设置环境变量 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/theme_name
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。
死键在Qt程序中不工作[编辑 | 编辑源代码]
如果你进行了正确的键盘配置,并且死键在GTK应用程序(或其他小部件工具包)中工作,但在KDE或任何Qt应用程序中不起作用,那么你可能没有在Xorg中加载正确的文件。
去确认的一种方法:
- launch a Qt app with
qt.xkb.compose.debug
logging rule enabled, eg. launching qtqr包:QT_LOGGING_RULES=qt.xkb.compose.debug=true qtqr
- then try to write a character using a dead key, eg.
<dead_circumflex> <e>
forê
(LATIN SMALL LETTER E WITH CIRCUMFLEX) - if you encounter
qt.xkb.compose: failed to create compose table
then you probably have this issue.
To fix this, first identify your locale. Then, if your locale doesn't have its own folder in /usr/share/X11/locale/
, eg. fr_FR.UTF-8
, look for it in the compose.dir
mapping file to find the corresponding compose file (eg. en_US.UTF-8/Compose
):
$ grep fr_FR.UTF-8 /usr/share/X11/locale/compose.dir
en_US.UTF-8/Compose fr_FR.UTF-8 en_US.UTF-8/Compose: fr_FR.UTF-8
Now create or edit ~/.XCompose
to include this compose file:
~/.XCompose
include "%S/en_US.UTF-8/Compose"
最后,重启Qt 软件, dead keys should be working and qt.xkb.compose: failed to create compose table
error should have disappeared whenever you debug with QT_LOGGING_RULES=qt.xkb.compose.debug=true
.