文章目录
问题来源
将应用程序从Qt / C ++移动到Qt / QML时,遇到系统托盘的问题。目的是将系统托盘的C ++代码部分的或全部的转换为QML代码。我意识到,第一个选项是利用信号和插槽机制包装QSystemTrayIcon,QMenu。这个解决方案非常符合逻辑,因为QML不是一个工具,比如使用MenuBar来构建System Tray。所以我们做了一个包装器,它可以在QML层中与QSystemTrayIcon进行交互。
在包装器实现之后,我注意QML不仅可以访问信号和插槽,还可以访问Q_PROPERTY的参数。也就是说,在QSystemTrayIcon类中,实际上只能将此类注册为QML中的类型层,并尝试在QML上编写几乎所有代码。
因此,在本文中,您将看到两个在QML中实现系统托盘的方法
通过单击系统托盘中的图标以及按关闭按钮,最终应用程序将最小化到系统托盘。但只有在活动时才会激活特殊复选框以控制应用程序窗口向系统托盘的折叠过程,如果未启用该复选框,则应用程序将关闭。此外,可以使用系统托盘图标中的活动复选框菜单项关闭应用程序。
第一个版本
Variant通过包装类使用系统托盘。
系统托盘项目的结构
这个项目包含以下文件:
QmlSystemTray.pro - 你知道这是啥
main.cpp -启动应用的主要文件
systemtray.h
systemtray.cpp -QSystemTrayIcon的包装
main.qml - QML代码
logo-min.png
QmlSystemTray.pro
TEMPLATE = app
QT += qml quick widgets
SOURCES += main.cpp \
systemtray.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Default rules for deployment.
include(deployment.pri)
HEADERS += \
systemtray.h
main.cpp
对单独的Qt / C ++类的对象进行声明和初始化,并从Qml层设置对它的访问。
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QSystemTrayIcon>
#include <systemtray.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
SystemTray * systemTray = new SystemTray();
QQmlContext * context = engine.rootContext();
// 将systemTray放入QML上下文中
context->setContextProperty("systemTray", systemTray);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
<