打开对话框时无法激活trayicon

时间:2017-07-16 05:06:38

标签: qt qt5 system-tray

(2019-01-02更新:简化我的例子)

我正在开发一个程序,可以最小化托盘并隐藏主窗口。当我点击托盘图标时,我希望显示主窗口。这通常有效,但我发现如果程序最小化到托盘,当我调用QFileDialog :: getOpenFileName()来选择文件而不关闭对话框时,我无法激活trayicon。有谁知道如何解决它?我在Manjaro Linux上使用Qt 5.12.0(使用Qt 5.9.0)。

最小,完整且可验证的示例:

main.cpp中:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h:

class MainWindow : public QMainWindow
{
    Q_OBJECT
    QSystemTrayIcon *trayIcon;
    QMenu *trayContextMenu;
    QAction *actShow;
    QPushButton *button;

public:
    MainWindow(QWidget *parent = 0);

protected:
    void changeEvent(QEvent *);

private slots:
    void click();
    void trayIcon_activated(QSystemTrayIcon::ActivationReason reason);
    void actShow_Triggered();
};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QPushButton *button = new QPushButton("button", this);
    setCentralWidget(button);
    connect(button,&QPushButton::clicked,
            this,&MainWindow::click);
    trayIcon=new QSystemTrayIcon;
    trayIcon->setIcon(QIcon("hmtimer.png"));
    trayContextMenu=new QMenu;
    actShow=trayContextMenu->addAction(tr("Show"));
    trayIcon->setContextMenu(trayContextMenu);
    connect(actShow,&QAction::triggered,
            this,&MainWindow::actShow_Triggered);
    connect(trayIcon,&QSystemTrayIcon::activated,
            this,&MainWindow::trayIcon_activated);
}

void MainWindow::changeEvent(QEvent *event)
{
    if(event->type()==QEvent::WindowStateChange){
        if(isMinimized()){
            this->hide();
            trayIcon->show();
        }
    }
    else{
        QMainWindow::changeEvent(event);
    }
}

void MainWindow::click()
{
    QFileDialog::getOpenFileName(this,QString());
}

void MainWindow::trayIcon_activated(QSystemTrayIcon::ActivationReason reason)
{
    if(reason==3){ //reason==Trigger
        this->show();
        trayIcon->hide();
    }
}

void MainWindow::actShow_Triggered()
{
    this->show();
    trayIcon->hide();
}

可以下载示例here

似乎如果程序在QFileDialog::getOpenFileName(this,QString())未关闭时最小化到托盘,我无法通过单击托盘图标或右键单击以显示上下文菜单来显示主窗口。

如何重现:

  1. 打开程序
  2. 点击按钮打开文件对话框
  3. 最小化托盘
  4. 尝试单击并右键单击托盘图标

1 个答案:

答案 0 :(得分:0)

我找到了一种显示主窗口的方法。我可以通过双击带有以下MainWindow :: trayIcon_activated代码的图标来完成此操作:

void MainWindow::trayIcon_activated(QSystemTrayIcon::ActivationReason reason)
{
    if(reason==QSystemTrayIcon::DoubleClick){
        this->show();
        trayIcon->hide();
    }
}

我仍然不知道如何通过单击显示主窗口或右键单击显示上下文菜单。如果有人知道,请告诉我。

编辑:似乎这不再适用。我尝试了前面的例子和新的例子。不知道出了什么问题。