QML如何与QSystemTrayIcon协同工作

问题来源

将应用程序从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();
}
<
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值