对于类似于后台服务的界面非常简单的程序,不需要总显示UI界面,最小化至托盘就是比较好的一个选择.
第一步:实现程序启动直接最小化至托盘图标.
1.新建一个QT项目(本例基类QQWidget,其他基类类似), 不勾选生成ui文件.
2.寻找一个图标文件(icon.ico),以供程序在托盘显示.向项目中添加一个资源文件,并添加prefix包含图标文件.
3.修改main.cpp中的w.show()为w.hide().托盘图标功能主要使用QSystemTrayIcon类,向窗口头文件中添加代码:
#include <QWidget>
#include <QSystemTrayIcon>
class main_win : public QWidget
{
Q_OBJECT
public:
main_win (QWidget *parent = 0);
~main_win ();
private:
QSystemTrayIcon *m_tray_icon;
};
4.在CPP文件中,修改构造函数,并添加槽函数的实现:
#include "main_win .h"
main_win ::main_win (QWidget *parent)
: QWidget(parent)
{
QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");
setWindowIcon(icon);
this->m_tray_icon = new QSystemTrayIcon(this);
m_tray_icon->setIcon(icon);
m_tray_icon->setToolTip(trUtf8("数据上传程序"));
m_tray_icon->show();
}
main_win ::~main_win ()
{
}
此时启动程序已经可以在托盘看到图标,并且任务栏也没有对应的程序图标.不过,此时对托盘图标不能做任何操作,只能在任务管理器里强制关闭进程.所以,我们需要进行改进.
第二步:给托盘图标添加双击显示主界面的功能
1.继续修改main_win.h, 添加槽函数声明.QSystemTrayIcon::ActivationReason 是一个枚举类型,表示托盘图标激活的方式.
#include <QWidget>
#include <QSystemTrayIcon>
class main_win : public QWidget
{
Q_OBJECT
public:
main_win (QWidget *parent = 0);
~main_win ();
private:
QSystemTrayIcon *m_tray_icon;
private slots:
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
};
4.修改main_win.cpp.添加槽函数实现,并鱼托盘图标对象链接.
#include "main_win .h"
main_win ::main_win (QWidget *parent)
: QWidget(parent)
{
QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");
setWindowIcon(icon);
this->m_tray_icon = new QSystemTrayIcon(this);
m_tray_icon->setIcon(icon);
m_tray_icon->setToolTip(trUtf8("数据上传程序"));
connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason) ) );
m_tray_icon->show();
}
main_win ::~main_win ()
{
}
void main_win ::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch (reason) {
case QSystemTrayIcon::Trigger:
// click
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
此时,启动程序,双击托盘图标,主界面就可以显示出来.
如果希望对托盘图标添加更多的交互,可以给托盘对象添加快捷菜单的方式.
第三步:添加托盘菜单
1.菜单功能需要用到QAction和QMenu类.给托盘添加两个菜单项,显示主界面和退出,修改main_win.h,添加代码如下:
#include <QWidget>
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
class main_win : public QWidget
{
Q_OBJECT
public:
main_win (QWidget *parent = 0);
~main_win ();
private:
QSystemTrayIcon *m_tray_icon;
QMenu *m_tray_menu;
QAction *m_action_quit;
QAction *m_action_open;
public:
void createActions();
void createMenus();
private slots:
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
void on_quit_app();
void on_show_main_win();
};
4.修改main_win.cpp文件,添加对应的实现.
#include "main_win.h"
main_win::main_win(QWidget *parent)
: QWidget(parent)
{
QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");
setWindowIcon(icon);
this->m_tray_icon = new QSystemTrayIcon(this);
m_tray_icon->setIcon(icon);
m_tray_icon->setToolTip(trUtf8("数据上传程序"));
// trar icon menu
createActions();
createMenus();
connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason) ) );
m_tray_icon->show();
}
main_win::~main_win()
{
}
void main_win::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch (reason) {
case QSystemTrayIcon::Trigger:
// click
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
void main_win::on_quit_app()
{
exit(0);
}
void main_win::createActions()
{
m_action_quit = new QAction(trUtf8("退出"),this);
connect(m_action_quit, SIGNAL(triggered()), this, SLOT(on_quit_app()));
m_action_open = new QAction(trUtf8("显示主界面"), this);
connect(m_action_open, SIGNAL(triggered()),this, SLOT(on_show_main_win()));
}
void main_win::createMenus()
{
m_tray_menu = new QMenu(this);
m_tray_menu->addAction(m_action_open);
m_tray_menu->addSeparator();
m_tray_menu->addAction(m_action_quit);
m_tray_icon->setContextMenu(m_tray_menu);
}
void main_win::on_show_main_win()
{
this->show();
}
此时,启动程序,右键托盘图标,会出现对应的菜单操作.