【问题标题】:Can not activate trayicon when dialog is open对话框打开时无法激活托盘图标
【发布时间】:2017-07-16 05:06:38
【问题描述】:

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

我正在开发一个可以最小化到托盘并隐藏主窗口的程序。我希望在单击托盘图标时显示主窗口。这通常有效,但我发现如果在我调用 QFileDialog::getOpenFileName() 来选择文件而不关闭对话框时程序最小化到托盘,我无法激活托盘图标。有谁知道如何解决它?我在 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();
}

主窗口.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

主窗口.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. 尝试单击并右键单击托盘图标

【问题讨论】:

  • @eyllanesc 我提供了一个例子。 (有没有比粘贴代码并在每行前面添加四个空格更好的提供代码的方法?)
  • 前面4行是什么意思?
  • found a way 提供代码而无需手动添加四个空格。我只需要选择整个代码块并按Ctrl + K。我选择的每一行代码都会自动缩进。

标签: qt qt5 system-tray


【解决方案1】:

我找到了一种显示主窗口的方法。我可以通过双击带有 MainWindow::trayIcon_activated 代码的图标来做到这一点:

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

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

编辑:似乎这不再有效。我尝试了我以前的示例和新示例。不知道怎么回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多