在应用程序关闭的时候最小化到系统托盘,想必大家都见过这个功能。如何用QSystemTrayIcon实现系统托盘功能呢?QT的源码里面有详细的例子,但是代码比较繁琐。我根据自己的经验将主要实现过程作简化介绍如下。
第一步创建QSystemTrayIcon
trayIcon = new QSystemTrayIcon(this);
第二步为QSystemTrayIcon添加右键菜单
minimizeAction = new QAction(tr("最小化"), this);
connect(minimizeAction, &QAction::triggered, this, &QWidget::hide);
maximizeAction = new QAction(tr("最大化"), this);
connect(maximizeAction, &QAction::triggered, this, &QWidget::showMaximized);
restoreAction = new QAction(tr("恢复"), this);
connect(restoreAction, &QAction::triggered, this, &QWidget::showNormal);
quitAction = new QAction(tr("退出"), this);
connect(quitAction, &QAction::triggered, this, &frmMain::quit);
trayIconMenu = new QMenu(this);
trayIconMenu->addAction(minimizeAction);
trayIconMenu->addAction(maximizeAction);
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon->setContextMenu(trayIconMenu);
第三步显示系统托盘
QIcon icon(“main.png”);
trayIcon->setIcon(icon);
trayIcon->setToolTip(AppConfig::TitleCn);
trayIcon->show();
最关键的是第三步,必须保证图标文件能够找到,文件格式能够支持。不然,图标创建不成功的话,你是看不到系统托盘效果的。
后面的就是辅助功能了,设置关闭消息,设置激活功能等等。
void frmMain::closeEvent(QCloseEvent* e)
{
if (trayIcon->isVisible())
{
QMessageBox::information(this, AppConfig::TitleCn, tr("程序将会在系统托盘中继续运行。要<b>关闭</b>程序请进入任务栏的系统托盘,并在弹出的菜单中选择<b>退出</b>按钮!"));
hide();
e->ignore();
}
}
void frmMain::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason)
{
case QSystemTrayIcon::Trigger:
case QSystemTrayIcon::DoubleClick:
showNormal();
break;
default:
break;
}
}