当用户在 Qt 应用程序中单击任务栏/停靠图标时获取事件或通知

Posted

技术标签:

【中文标题】当用户在 Qt 应用程序中单击任务栏/停靠图标时获取事件或通知【英文标题】:Get event or notification when user click in taskbar/dock icon in Qt application 【发布时间】:2014-04-10 09:55:04 【问题描述】:

我正在 osx、windows、linux 中开发应用程序

我想制作像Skype这样的功能。当用户单击关闭窗口时,应用程序不会退出而是隐藏。当用户单击 Dock 或任务栏上的 appicon 时,我的主窗口将重新打开。

当用户点击应用图标时,我如何获得通知或过滤事件?

【问题讨论】:

【参考方案1】:

首先,您需要防止您的应用程序窗口在您点击“关闭窗口”按钮时关闭。假设您使用QMainWindow:

class MainWindow : public QMainWindow

    // .. constructors, etc.
    // ..
protected:
    void closeEvent(QCloseEvent *)
    
        // Do not close, but hide the window.
        hide();
    
;

Qt 有专门的类来处理任务栏图标 - QSystemTrayIcon。因此,简单的应用程序如下所示:

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    MainWindow mw;
    QSystemTrayIcon tray; // needs an icon.

    // Show the main window when user activates the tray icon.
    QObject::connect(&tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
                     &mw, SLOT(show()));
    tray.show();

    return app.exec();

【讨论】:

谢谢 vahancho,我发现当用户在任务栏上单击它时,我的应用程序使用 lower() 而不是 close() 可以重新激活。但是 QSystemTrayIcon 为我的应用程序带来了一个新功能。谢谢 您对closeEvent 的使用是错误的。此方法仅通知您将关闭一个窗口,您不能覆盖该操作。如果要阻止窗口关闭,则必须重新实现event 方法。对于您希望删除的事件,请返回 true 并且不要调用基类的 event 方法。 @KubaOber,用法没有错,我可以覆盖它。甚至文档都说:“你可以重新实现这个函数来改变窗口小部件响应窗口关闭请求的方式。例如,你可以通过在所有事件上调用 ignore() 来阻止窗口关闭。” @vahancho 啊,你说得对,我忘了ignore。但是你没有调用它,你必须调用它!这与重新实现 event 的效果相同。 这可能适用于 Windows 和 Linux(不知道),但在 Mac 上,停靠图标与“系统托盘图标”(又名菜单栏小部件)不同。当我在 mac 上尝试这个时,单击停靠图标时它不起作用。【参考方案2】:

这应该会有所帮助:

 void setQuitOnLastWindowClosed(bool quit)

【讨论】:

以上是关于当用户在 Qt 应用程序中单击任务栏/停靠图标时获取事件或通知的主要内容,如果未能解决你的问题,请参考以下文章

从停靠栏隐藏应用程序图标,但在任务切换器中保留图标?

在空中隐藏新窗口的停靠图标

在最小化到停靠后恢复 Qt 应用程序,使用 OS X 上的停靠快捷方式

单击停靠图标时如何打开应用程序窗口?

如何通过单击任务栏图标禁用最小化

如何设置应用程序的任务栏图标在Windows 7-qt,windows-7,pyqt