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

Posted

技术标签:

【中文标题】如何通过单击任务栏图标禁用最小化【英文标题】:How to disable minimizing by taskbar icon click 【发布时间】:2015-01-16 19:22:18 【问题描述】:

在我的程序工作期间,我偶然发现了非常奇怪的行为。 我编写了自定义 changeEvent 类,它允许我在最小化时将程序隐藏到 SysTray。 但是当我双击任务栏应用程序图标时,该功能变得疯狂。它创建 2 到 4 个系统托盘图标,并在再次请求窗口显示时,它只显示主窗口边框,内部没有任何内容。

这是我的 changeEvent 代码:

void MainWindow::changeEvent(QEvent *e) 
QMainWindow::changeEvent(e);
if(e->type()==QEvent::WindowStateChange)
    if(isMinimized()) 
        trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
        connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));

        QAction *showAction=new QAction("Pokaż",trayIcon);
        connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));

        QMenu *trayIconMenu=new QMenu;
        trayIconMenu->addAction(showAction);

        trayIcon->setContextMenu(trayIconMenu);
        trayIcon->show();

        this->hide();
    

on_show(QSystemTrayIcon::ActivatioReason) SLOT:

void MainWindow::on_show(QSystemTrayIcon::ActivationReason reason) 
    if(reason) 
        if(reason!=QSystemTrayIcon::DoubleClick)
            return;
    
    if(this->isMinimized()) 
        this->raise();
        this->showNormal();
        this->setWindowState(Qt::WindowActive);
        trayIcon->hide();
    

on_show() SLOT 除了第一个 if 之外其他都一样。

Soo,我想知道是否有任何方法可以通过单击任务栏图标来禁用窗口最小化。 如果没有,那么您可能知道双击任务栏中的图标时会出现什么问题?

感谢您的帮助!

【问题讨论】:

你能分享on_showSLOT吗? 在这里,我编辑了主帖。 一方面看起来你正在泄漏QSystemTrayIcon,因为每次最小化事情时你都会制作一个新的,似乎没有清理。此外,在on_show 中,您设置了窗口状态,这可能会导致再次调用changeEvent,而窗口仍处于最小化状态。 【参考方案1】:

我已经设法通过重载 closeEvent 函数并不理会 changeEvent 函数来解决这个问题。

因此,我使用布尔标志来区分按菜单项关闭程序和单击“X”按钮,其余部分保持不变,正如我在之前的帖子中发布的一样。

正如 Nicolas 所指出的,我已将整个代码块移至窗口构造函数,以防止多次创建托盘图标。

    trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
    connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));

    QAction *showAction=new QAction("Pokaż",trayIcon);
    connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));

    QMenu *trayIconMenu=new QMenu;
    trayIconMenu->addAction(showAction);

    trayIcon->setContextMenu(trayIconMenu);

感谢您的帮助!

【讨论】:

以上是关于如何通过单击任务栏图标禁用最小化的主要内容,如果未能解决你的问题,请参考以下文章

请问怎样使程序在最小化后图标放在任务栏的托盘上?

任务栏总是显示所有图标无法折叠隐藏

最小化后不在任务栏显示图标怎么办

如何在 guizero/tkinter python 3 中将图标添加回任务栏?

打开的程序如何快速最小化到任务栏

如何在 Windows 7 上删除 Java 程序的标题栏和任务栏图标?