Qt程序实现最小化托盘显示
1、功能实现
在实现最小化时,程序从任务栏消失,在系统托盘显示一个图标代表此程序,且能通过系统托盘内的图标点击或者菜单程序使界面恢复。
2、类的使用
// 使用QSystemTraylcon类
// 头文件:
#includ <QSystemTraylcon>
QSystemTraylcon类是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标。并响应用户鼠标的点击、wheel操作,显示指定消息、菜单等。
QSystemTraylcon类的两个枚举类型:
enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由
常量 | 值 | 描述 |
---|---|---|
QSystemTrayIcon::Unknown | 0 | 未知原因 |
QSystemTrayIcon::Context | 1 | 请求系统托盘的上下文菜单 |
QSystemTrayIcon::DoubleClick | 2 | 鼠标双击 |
QSystemTrayIcon::Trigger | 3 | 鼠标单击 |
QSystemTrayIcon::MiddleClick | 4 | 鼠标中间按键 |
enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片
常量 | 值 | 描述 |
---|---|---|
QSystemTrayIcon::NoIcon | 0 | 不显示图标 |
QSystemTrayIcon::Information | 1 | 显示信息图标 |
QSystemTrayIcon::Warning | 2 | 显示告警图标 |
QSystemTrayIcon::Critical | 3 | 显示致命图标 |
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();
}