Qt程序实现最小化托盘显示

Qt程序实现最小化托盘显示


1、功能实现

​ 在实现最小化时,程序从任务栏消失,在系统托盘显示一个图标代表此程序,且能通过系统托盘内的图标点击或者菜单程序使界面恢复

2、类的使用
// 使用QSystemTraylcon类
// 头文件:
#includ <QSystemTraylcon>

QSystemTraylcon类是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标。并响应用户鼠标的点击wheel操作,显示指定消息、菜单等。

​ QSystemTraylcon类的两个枚举类型:

enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由

常量描述
QSystemTrayIcon::Unknown0未知原因
QSystemTrayIcon::Context1请求系统托盘的上下文菜单
QSystemTrayIcon::DoubleClick2鼠标双击
QSystemTrayIcon::Trigger3鼠标单击
QSystemTrayIcon::MiddleClick4鼠标中间按键

enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片

常量描述
QSystemTrayIcon::NoIcon0不显示图标
QSystemTrayIcon::Information1显示信息图标
QSystemTrayIcon::Warning2显示告警图标
QSystemTrayIcon::Critical3显示致命图标
3、QSystemTrayIcon常用函数
void setIcon(const QIcon& icon);       //设置系统托盘的图标
void setToolTip(const QString &tip);   //设置鼠标放到图标上的提示文字
void setContextMenu(QMenu* menu);      //设置当点击图标弹出的菜单
void show();                           //显示系统托盘图标
void hide();                           //隐藏系统托盘图标
4、代码示例
// .pro
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = SystemTraylconDemo
TEMPLATE = app
CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkwidget

SOURCES += \
        main.cpp \
    mywidget.cpp

RESOURCES +=         resources.qrc \
    images.qrc

HEADERS += \
    mywidget.h

//.h
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <DWidget>
#include <DPushButton>
#include <QSystemTrayIcon>

DWIDGET_USE_NAMESPACE

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);

private:
    DPushButton *closButton;
    DPushButton *minButton;

    QSystemTrayIcon *mSysTrayIcon;

    int time;

signals:

public Q_SLOT:
    void on_minButton_clicke();
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason);
};

#endif // MYWIDGET_H
//.cpp
#include "mywidget.h"
#include <QIcon>
#include <QDebug>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    // 创建QSysTrayIcon对象
    mSysTrayIcon = new QSystemTrayIcon(this);

    closButton = new DPushButton(this);
    closButton->setText(tr("close"));
    closButton->setFixedSize(100, 30);
    closButton->move(20, 100);

    minButton = new DPushButton(this);
    minButton->setText(tr("mix"));
    minButton->setFixedSize(100, 30);
    minButton->move(20, 200);

    connect(closButton, &DPushButton::clicked,
    [ = ]() {
        this->close();
    });
    connect(minButton, &DPushButton::clicked,
    [ = ]() {
        this->on_minButton_clicke();
    });
    connect(mSysTrayIcon, &QSystemTrayIcon::activated, this, &MyWidget::on_activatedSysTrayIcon);
}

void MyWidget::updateDateTimer()
{
    mSysTrayIcon->setToolTip(QObject::trUtf8("系统托盘demo-%1").arg(time));
    time++;
}

void MyWidget::on_minButton_clicke()
{
    // 隐藏程序主窗口
    this->hide();

    // 新建托盘要显示的icon
    QIcon icon = QIcon(":/images/images/icon.png");
    // 将icon设到QSysTrayIcon对象中
    mSysTrayIcon->setIcon(icon);
    // 当鼠标移动到托盘上的图标时,会显示此处设置的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8("系统托盘demo-%1").arg(time));
    // 在系统托盘显示此对象
    mSysTrayIcon->show();
}

void MyWidget::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    qDebug() << "reason = " << reason;

    switch (reason) {
    // 单击托盘图标
    case QSystemTrayIcon::Trigger:
        /**
         * 显示消息球,1s后自动消失
         * 第一个参数是标题
         * 第二个参数是消息内容
         * 第三个参数图标
         * 第四个参数是超时毫秒数
         */
        mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                  QObject::trUtf8("测试,潜龙勿用"),
                                  QSystemTrayIcon::Information, 1000);
        break;
    case QSystemTrayIcon::DoubleClick:
        // 双击托盘图标
        // 双击后显示主程序窗口
        // TODO: 双击或wheel操作只对X11系统有效
        this->close();
        break;
    default:
        break;
    }
}
//main.cpp
#include <DApplication>
#include <DMainWindow>
#include <DWidgetUtil>

#include "mywidget.h"

DWIDGET_USE_NAMESPACE

int main(int argc, char *argv[])
{
    DApplication::loadDXcbPlugin();
    DApplication a(argc, argv);

    MyWidget w;
    w.setMinimumSize(500, 500);
    w.show();

    Dtk::Widget::moveToCenter(&w);

    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值