2017-07-16 52 views
0

我正在開發一個程序,它可以最小化托盤並隱藏主窗口。我希望當我點擊托盤圖標時顯示主窗口。這通常起作用,但我發現如果程序使用QFileDialog :: getOpenFileName選擇文件並且沒有關閉對話框時,程序最小化爲托盤,我無法激活trayicon。有誰知道如何解決它?我在Manjaro Linux上使用Qt 5.9.0。對話框打開時無法激活trayicon

最小,完整的,並且可驗證例如:

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:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QSystemTrayIcon> 

namespace Ui { 
class MainWindow; 
} 

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

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

protected: 
    void changeEvent(QEvent *); 

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

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp:

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

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    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); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

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

void MainWindow::on_pushButton_clicked() 
{ 
    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())沒有關閉,我不能讓主窗口出現點擊托盤圖標或右鍵單擊以顯示上下文菜單。

+0

請你能提供一個[最小,完整,可驗證的示例](https://stackoverflow.com/help/mcve)我提供了一個例子 – eyllanesc

+0

@eyllanesc。 (有porviding代碼要比將其粘貼在每行前添加四個空格更好的辦法?) – cges30901

+0

你是什麼意思與4號線在前面? – eyllanesc

回答

0

我找到了一種顯示主窗口的方法。我可以通過雙擊與主窗口:: trayIcon_activated以下代碼的圖標做到這一點:

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

我還是不知道如何表達與單一點擊主窗口或顯示與右鍵單擊上下文菜單。如果有人知道,請告訴我。