如何禁用通过任务栏图标单击最小化
How to disable minimizing by taskbar icon click
我在编写程序时偶然发现了非常奇怪的行为。
我已经编写了自定义 changeEvent class,它允许我在最小化时将程序隐藏到 SysTray。
但是当我双击任务栏应用程序图标时,该功能变得疯狂。它创建 2 到 4 个系统托盘图标,并在再次请求 window 显示时,它只显示主 window 边框,里面没有任何内容。
这是我的 changeEvent 代码:
void MainWindow::changeEvent(QEvent *e) {
QMainWindow::changeEvent(e);
if(e->type()==QEvent::WindowStateChange)
if(isMinimized()) {
trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));
QAction *showAction=new QAction("Pokaż",trayIcon);
connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));
QMenu *trayIconMenu=new QMenu;
trayIconMenu->addAction(showAction);
trayIcon->setContextMenu(trayIconMenu);
trayIcon->show();
this->hide();
}
}
on_show(QSystemTrayIcon::ActivatioReason) 插槽:
void MainWindow::on_show(QSystemTrayIcon::ActivationReason reason) {
if(reason) {
if(reason!=QSystemTrayIcon::DoubleClick)
return;
}
if(this->isMinimized()) {
this->raise();
this->showNormal();
this->setWindowState(Qt::WindowActive);
trayIcon->hide();
}
}
on_show() SLOT 除了第一个 if.
是一样的
Soo,我想知道是否有任何方法可以通过单击任务栏图标来禁用最小化window。
如果有 none,那么您可能知道双击任务栏中的图标时这里会出现什么问题?
感谢帮助!
我已经设法通过重载 closeEvent 函数并单独留下 changeEvent 函数来解决该问题。
因此,我使用布尔标志来区分通过菜单项关闭程序和通过单击 "X" 按钮关闭程序,其余部分保持不变,就像我之前 posted post 有一个变化。
我已将整个代码块移至 window 构造函数,以防止多次创建 trayIcon,正如 Nicolas 所指出的。
trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));
QAction *showAction=new QAction("Pokaż",trayIcon);
connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));
QMenu *trayIconMenu=new QMenu;
trayIconMenu->addAction(showAction);
trayIcon->setContextMenu(trayIconMenu);
感谢您的帮助!
我在编写程序时偶然发现了非常奇怪的行为。 我已经编写了自定义 changeEvent class,它允许我在最小化时将程序隐藏到 SysTray。 但是当我双击任务栏应用程序图标时,该功能变得疯狂。它创建 2 到 4 个系统托盘图标,并在再次请求 window 显示时,它只显示主 window 边框,里面没有任何内容。
这是我的 changeEvent 代码:
void MainWindow::changeEvent(QEvent *e) {
QMainWindow::changeEvent(e);
if(e->type()==QEvent::WindowStateChange)
if(isMinimized()) {
trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));
QAction *showAction=new QAction("Pokaż",trayIcon);
connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));
QMenu *trayIconMenu=new QMenu;
trayIconMenu->addAction(showAction);
trayIcon->setContextMenu(trayIconMenu);
trayIcon->show();
this->hide();
}
}
on_show(QSystemTrayIcon::ActivatioReason) 插槽:
void MainWindow::on_show(QSystemTrayIcon::ActivationReason reason) {
if(reason) {
if(reason!=QSystemTrayIcon::DoubleClick)
return;
}
if(this->isMinimized()) {
this->raise();
this->showNormal();
this->setWindowState(Qt::WindowActive);
trayIcon->hide();
}
}
on_show() SLOT 除了第一个 if.
是一样的Soo,我想知道是否有任何方法可以通过单击任务栏图标来禁用最小化window。 如果有 none,那么您可能知道双击任务栏中的图标时这里会出现什么问题?
感谢帮助!
我已经设法通过重载 closeEvent 函数并单独留下 changeEvent 函数来解决该问题。
因此,我使用布尔标志来区分通过菜单项关闭程序和通过单击 "X" 按钮关闭程序,其余部分保持不变,就像我之前 posted post 有一个变化。
我已将整个代码块移至 window 构造函数,以防止多次创建 trayIcon,正如 Nicolas 所指出的。
trayIcon=new QSystemTrayIcon(QIcon(":/icon/itime.ico"));
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_show(QSystemTrayIcon::ActivationReason)));
QAction *showAction=new QAction("Pokaż",trayIcon);
connect(showAction,SIGNAL(triggered()),this,SLOT(on_show()));
QMenu *trayIconMenu=new QMenu;
trayIconMenu->addAction(showAction);
trayIcon->setContextMenu(trayIconMenu);
感谢您的帮助!