Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行菜单中的任何操作后,Qt托盘应用程序自动关闭_Qt_C++11 - Fatal编程技术网

执行菜单中的任何操作后,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

我是QT新手,遇到了一个问题

我决定尝试使用Qt和QSystemTrayIcon编写一个小应用程序。首先,我决定从Qt的官方网站复制这个例子

这是我的头文件:

#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);