执行菜单中的任何操作后,Qt托盘应用程序自动关闭
我是QT新手,遇到了一个问题 我决定尝试使用Qt和QSystemTrayIcon编写一个小应用程序。首先,我决定从Qt的官方网站复制这个例子 这是我的头文件:执行菜单中的任何操作后,Qt托盘应用程序自动关闭,qt,c++11,Qt,C++11,我是QT新手,遇到了一个问题 我决定尝试使用Qt和QSystemTrayIcon编写一个小应用程序。首先,我决定从Qt的官方网站复制这个例子 这是我的头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSystemTrayIcon> namespace Ui { class MainWindow; } class MainWindow : publ
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QMenu *trayIconMenu;
QAction *launchAction;
QAction *quitAction;
QSystemTrayIcon *trayIcon;
public slots:
void changeEvent(QEvent*);
void trayIconActivated(QSystemTrayIcon::ActivationReason reason);
void trayActionExecute();
void setTrayIconActions();
void showTrayIcon();
};
#endif // MAINWINDOW_H
有什么不对劲
谢谢。可以通过最小化主窗口(根据
changeEvent()
实现将其隐藏)并随后单击系统托盘图标菜单中的“启动”来重现该问题。将显示消息框,然后应用程序将简单地关闭
这是由QT的一个名为QuitOnLastWindowClosed
的“功能”造成的,该功能在默认情况下处于启用状态。如果启用,应用程序将在最后一个非隐藏窗口关闭时退出-在您的示例中,这是由“Launch”命令生成的消息框(该命令视为窗口)
您可以通过调用QApplication::setQuitOnLastWindowClosed(false)来解决此问题代码>在创建QApplication
后的某个时间点,例如在main.cpp
中,可能会设置您的应用程序:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow w;
w.show();
return a.exec();
}
另一方面,您的connect()
语法在showTrayIcon()
中是错误的:它应该拼写SIGNAL(activated(QSystemTrayIcon::ActivationReason))
而不是SLOT(activated(QSystemTrayIcon::ActivationReason))
但我强烈建议使用新的信号/插槽语法()
这样做的好处是在编译时而不是运行时向您显示任何错误(如未知信号/插槽或不兼容的参数)。可以通过最小化主窗口来重现该问题,主窗口根据changeEvent()
实现将其隐藏,然后单击系统托盘图标菜单中的“启动”。将显示消息框,然后应用程序将简单地关闭
这是由QT的一个名为QuitOnLastWindowClosed
的“功能”造成的,该功能在默认情况下处于启用状态。如果启用,应用程序将在最后一个非隐藏窗口关闭时退出-在您的示例中,这是由“Launch”命令生成的消息框(该命令视为窗口)
您可以通过调用QApplication::setQuitOnLastWindowClosed(false)来解决此问题代码>在创建QApplication
后的某个时间点,例如在main.cpp
中,可能会设置您的应用程序:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow w;
w.show();
return a.exec();
}
另一方面,您的connect()
语法在showTrayIcon()
中是错误的:它应该拼写SIGNAL(activated(QSystemTrayIcon::ActivationReason))
而不是SLOT(activated(QSystemTrayIcon::ActivationReason))
但我强烈建议使用新的信号/插槽语法()
这样做的好处是可以在编译时而不是运行时向您显示任何错误(如未知信号/插槽或不兼容的参数)。请提供一个最小的、完整的可验证示例,即我们可以编译并运行以重现错误的示例。您忽略了start()
和trayActionExecute()
方法,这两种方法可能是问题的根源。另外,请通过适当的缩进来改进代码的格式,这将使它更具可读性。我为质量道歉。我通过电话添加了一条帖子,但没有立即看到这个糟糕的设计。已编辑。感谢改进您的帖子。一些遗留问题:showMsg
未在标题中声明,closeEvent
引用未知类SafeEyeTimer
,并且缺少main window.ui
文件(尽管它与您的问题无关,但您可以简单地删除它以获得较小的MCVE)。但我现在可以复制了:)哦,是的,谢谢。我从另一个应用程序添加这个类。请提供一个最小的、完整的、可验证的示例,也就是说,我们可以编译并运行它来重现错误。您忽略了start()
和trayActionExecute()
方法,这两种方法可能是问题的根源。另外,请通过适当的缩进来改进代码的格式,这将使它更具可读性。我为质量道歉。我通过电话添加了一条帖子,但没有立即看到这个糟糕的设计。已编辑。感谢改进您的帖子。一些遗留问题:showMsg
未在标题中声明,closeEvent
引用未知类SafeEyeTimer
,并且缺少main window.ui
文件(尽管它与您的问题无关,但您可以简单地删除它以获得较小的MCVE)。但我现在可以复制了:)哦,是的,谢谢。我从另一个应用程序添加这个类。编辑。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow w;
w.show();
return a.exec();
}
connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconActivated);