【发布时间】: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()) 未关闭时最小化到托盘,我无法通过单击托盘图标或右键单击显示上下文菜单来显示主窗口。
如何重现:
- 打开程序
- 点击按钮打开文件对话框
- 最小化到托盘
- 尝试单击并右键单击托盘图标
【问题讨论】:
-
@eyllanesc 我提供了一个例子。 (有没有比粘贴代码并在每行前面添加四个空格更好的提供代码的方法?)
-
前面4行是什么意思?
-
我found a way 提供代码而无需手动添加四个空格。我只需要选择整个代码块并按
Ctrl + K。我选择的每一行代码都会自动缩进。
标签: qt qt5 system-tray