cges30901
cges30901

Reputation: 550

Can not activate trayicon when dialog is open

(Update on 2019-01-02: Simplify my example)

I am working on a program that can minimize to tray and hide the main window. I expect the mainwindow to show when I click on the tray icon. This usually works, but I find that if the program minimizes to tray when I call QFileDialog::getOpenFileName() to select file without closing the dialog, I cannot activate the trayicon. Does anyone know how to solve it? I am using Qt 5.12.0 (was using Qt 5.9.0) on Manjaro Linux.

Minimal, Complete, and Verifiable example:

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();
}

The example can be downloaded here

It seems that if the program minimizes to tray when QFileDialog::getOpenFileName(this,QString()) is not closed, I cannot make the mainwindow appear by click on the tray icon or right click to show the context menu.

How to reproduce:

  1. Open the program
  2. Click on the button to open file dialog
  3. Minimize to tray
  4. Try clicking and right-clicking on the tray icon

Upvotes: 1

Views: 269

Answers (1)

cges30901
cges30901

Reputation: 550

I found a way to show the main window. I can do this by double clicking the icon with the following code of MainWindow::trayIcon_activated:

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

I still don't know how to show the mainwindow with single click or show the context menu with right click. If anyone knows, please tell me.

EDIT: Seems that this no longer works. I tried both my previous example and new example. Don't know what is going wrong.

Upvotes: 1

Related Questions