原文地址
前言
系统应用程序经常需要保持在后台工作,这里我们简单展示下Qt
开发下系统托盘的实现
实现
核心代码就一行,在main.cpp
写入,即可保证在关闭时保留系统进程
QApplication::setQuitOnLastWindowClosed(false);
这里展示系统托盘的示例,可以根据需求增减代码
//h
class AdminWidget : public QWidget
{
Q_OBJECT
public:
AdminWidget(QWidget* parent = nullptr);
~AdminWidget() override;
//...
private:
void initSysTrayIcon();
void initAppMenu();
//...
private:
//...
QSystemTrayIcon* m_sysTrayIcon;
QMenu* m_menu;
QAction* m_showMainAction;
QAction* m_exitAppAction;
//...
private:
void systemIconActivatedEvent(QSystemTrayIcon::ActivationReason reason);
void showAppMainEvent();
void exitAppEvent();
//...
};
//.cpp
AdminWidget::AdminWidget(QWidget* parent) : QWidget(parent)
{
//...
setWindowIcon(QIcon(K_ADMIN_ICON_PATH));
setWindowTitle(K_ADMIN_APP_NAME);
initSysTrayIcon();
//..
}
AdminWidget::~AdminWidget()
{
//...
}
//...
void AdminWidget::initSysTrayIcon()
{
m_sysTrayIcon = new QSystemTrayIcon(this);
// base
{
m_sysTrayIcon->setVisible(true);
m_sysTrayIcon->setIcon(QIcon(K_ADMIN_ICON_PATH));
m_sysTrayIcon->showMessage(K_ADMIN_APP_NAME, "工具箱已启动");
m_sysTrayIcon->setToolTip(K_ADMIN_APP_NAME);
}
// left click
connect(m_sysTrayIcon, &QSystemTrayIcon::activated, this, &AdminWidget::systemIconActivatedEvent);
// right click
initAppMenu();
// show
m_sysTrayIcon->show();
}
void AdminWidget::initAppMenu()
{
// action
m_showMainAction = new QAction("主界面");
connect(m_showMainAction, &QAction::triggered, this, &AdminWidget::showAppMainEvent);
m_exitAppAction = new QAction("退出");
connect(m_exitAppAction, &QAction::triggered, this, &AdminWidget::exitAppEvent);
// menu
m_menu = new QMenu();
m_menu->addAction(m_showMainAction);
m_menu->addSeparator();
m_menu->addAction(m_exitAppAction);
m_sysTrayIcon->setContextMenu(m_menu);
}
void AdminWidget::systemIconActivatedEvent(QSystemTrayIcon::ActivationReason reason)
{
if (QSystemTrayIcon::Trigger == reason || QSystemTrayIcon::DoubleClick == reason)
{
this->show();
}
}
void AdminWidget::showAppMainEvent()
{
this->show();
}
void AdminWidget::exitAppEvent()
{
QApplication::exit();
}
//...