【问题标题】:How to handle system buttons click in Qt console application如何在 Qt 控制台应用程序中处理系统按钮单击
【发布时间】:2015-09-23 18:23:30
【问题描述】:

我想在 Qt 中创建一个控制台应用程序来处理控制台窗口的关闭、最小化和最大化按钮。我的目标只是在应用程序退出之前显示一些消息 - 即单击关闭按钮。

此外,我希望将应用程序最小化到系统托盘而不是任务栏。但是,当用户单击其中一个系统按钮时,似乎没有可以处理的信号或事件。

有可能吗?

【问题讨论】:

    标签: qt


    【解决方案1】:

    我认为您无法通过 Qt 提供的 API 处理此类“信号”(最小化、最大化和关闭运行 QCoreApplication 的终端窗口)。

    但是QCoreApplication 发送了一个名为aboutToQuit() 的信号。可能你可以用它来做你想做的事(比如在终端里写),只是不知道用户是否能及时阅读。

    关于将应用程序最小化到托盘:同样,在使用 Qt API 的终端应用程序中可能无法做到这一点。但在QApplication(有一个窗口)中完全有可能。请参阅this answer 到类似的 SO 问题。

    【讨论】:

    • 我知道“aboutToQuit()”信号,但根据文档,在这种状态下不可能进行用户交互。我也知道如何创建系统托盘图标和菜单,它可以工作,我只是无法捕捉按钮点击,从而调用适当的处理程序。你是对的,这在 Qt 中是不可能的,但是我可以安装一个 WinApi 处理程序“SetConsoleCtrlHandler”来处理系统点击,但我无法让它正常工作。我放弃;我的应用程序将有一个简单的 GUI...
    【解决方案2】:

    您可以在 Linux 和 Windows 中使用 POSIX 信号 #包括

    void quit_handle( int ) {
        qApp->quit();
    }
    int main( int argc, char *argv[] ) {
        QCoreApplication a(argc, argv);
        ...
        signal( SIGINT, quit_handle );
        return a.exec();
    }
    

    我只在 Windows+MinGW 中测试过,但我认为它也可以在 Linux 中运行

    【讨论】:

      【解决方案3】:

      您使用的是 Unix / Linux 还是 Windows? 如果您使用的是 Unix 或 Linux,您可能需要查看 Posix / Unix Signals。 他们没有为最大化/最小化按钮提供任何解决方案, 但是当您按下关闭按钮时,它们至少可以让您捕捉到系统信号。根据我的经验,aboutToQuit() 信号不如信号处理程序的自定义覆盖快。

      一旦你捕捉到信号,你就可以自己处理它。

      这是自定义信号处理程序的一个很好的教程:

      http://doc.qt.io/qt-5/unix-signals.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 2018-05-08
        • 2021-09-11
        相关资源
        最近更新 更多