明白一个概念:托盘应用程序,本身应用程序并没有消失,只是隐藏;而托盘程序更像一个独立的小form存于托盘中。
引出要介绍的类,QSystemTrayIcon;具体作用就是为托盘form添加一些 icon、tooltip、和一些功能。
- setIcon,设置托盘图标
- setContextMenu,绑定鼠标点击后的弹出菜单
- activated,这是一个信号;可以找到对应的枚举。表示的是系统托盘被激活的原因;可以通过这个来实现双击托盘显示界面。
- isSystemTrayAvailable,判断系统是否支持托盘。
有了这些了解,就可以创建代码了
//菜单的创建
menu=new QMenu(this);
mExit=new QAction(QStringLiteral("退出"),this);
mShow=new QAction(QStringLiteral("显示主界面"),this);
connect(mShow,&QAction::triggered,this,&MainWindow::showForm);
connect(mExit,&QAction::triggered,this,&MainWindow::exitApp);
menu->addAction(mShow);
menu->addSeparator();
menu->addAction(mExit);
//托盘指示的创建
if (!QSystemTrayIcon::isSystemTrayAvailable())
{
QMessageBox::information(this,QStringLiteral("托盘提示"),QStringLiteral("不支持托盘"));
}
else
{
tray=new QSystemTrayIcon(this);
QIcon icon=QIcon("./hh_logo.ico");
tray->setIcon(icon);
tray->setToolTip(QStringLiteral("测试成功"));
tray->setContextMenu(menu);//关联菜单
connect(tray,&QSystemTrayIcon::activated,this,&MainWindow::activeForm);
}
}
void MainWindow::on_pushButton_clicked()
{//一个button按钮
this->close();
}
void MainWindow::closeEvent(QCloseEvent *event)
{//重写的窗口关闭事件
if (QMessageBox::information(this,QStringLiteral("关闭提示"),QStringLiteral("是否退出"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
event->accept();
else
{
event->ignore();
this->hide();
tray->show();
}
}
void MainWindow::exitApp()
{//退出程序
exit(0);
}
void MainWindow::showForm()
{//右键菜单的显示界面
this->show();
}
void MainWindow::activeForm(QSystemTrayIcon::ActivationReason reason)
{//对应的托盘信号 接收的槽函数
if (reason ==2)
this->show();
else
return;
}
上面是一些基本的操作。
下面是.h的声明
private slots:
void on_pushButton_clicked();
void showForm();
void exitApp();
void activeForm(QSystemTrayIcon::ActivationReason reason);
private:
Ui::MainWindow *ui;
void closeEvent(QCloseEvent *event);// 关闭窗体
QSystemTrayIcon *tray;
QMenu *menu;
QAction *mShow;
QAction *mExit;
完全ojbk。