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

时间:2015-01-16 19:22:18

标签: c++ qt

在我的节目工作期间,我偶然发现了非常奇怪的行为。 我已经编写了自定义 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()除了第一个 if 之外,SLOT也是一样的。

Soo,我想知道是否有任何方法可以通过任务栏图标点击禁用窗口最小化。 如果没有,那么当你双击任务栏中的图标时,也许你有任何想法可以在这里出错?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我设法通过重载 closeEvent 函数并单独留下 changeEvent 函数来解决该问题。

所以,我使用布尔标志来区分菜单项关闭程序和单击“X”按钮,其余部分保持不变,就像我之前的帖子中发布的一次更改一样。

我已经将整个代码块移动到窗口构造函数中,以防止多次创建trayIcon,如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);

感谢您的帮助!