程序运行在 macos, 如下图所示,当右击托盘图标时会发生异常(图中左上角),这是为么呢?
代码如下,还想请教一点,为什么单击的时候也会出现菜单呢?
void MainWindow::SltTrayClicked(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: // 单击 if (!this->isVisible()) { this->show(); } break; case QSystemTrayIcon::Context: // 右击 if (!m_trayMenu->isVisible()) { m_trayMenu->show(); } break; default: break; } }
1 NoOneNoBody 198 天前 trayMenu 要绑定 trayIcon ,没有绑定的话它只是个一般 menu |
2 Bssn OP @NoOneNoBody 已经绑定了啊,请教一下: ``` c++ void MainWindow::InitSystemTray() { // 1. 初始化托盘 m_systemTray = new QSystemTrayIcon(this); m_systemTray->setIcon(QIcon(":/resource/background/app.png")); // 2. 初始化托盘菜单 m_trayMenu = new QMenu(this); m_trayMenu->addAction("我在线上"); m_trayMenu->addAction("离线"); m_trayMenu->addSeparator(); m_trayMenu->addAction("显示主面板"); m_trayMenu->addSeparator(); m_trayMenu->addAction("退出"); // 3. 将托盘菜单添加进托盘 m_systemTray->setContextMenu(m_trayMenu); m_systemTray->show(); // 4. 关联菜单项对应的槽函数 connect(m_systemTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(SltTrayClicked(QSystemTrayIcon::ActivationReason))); connect(m_trayMenu, SIGNAL(triggered(QAction*)), this, SLOT(SltTrayMenuClicked(QAction*))); } ``` |
3 NoOneNoBody 198 天前 我是写 pyqt ,C++只能约莫看懂 看上去没太大问题,不过建议 trayicon/traymenu 创建时,parent 指定变量名,因为创建对象有多种方式,我写 pyqt 防止出错都写上 parent=xxx 的 QSystemTrayIcon 可以是第一个变量 icon ,parent 默认用 null 创建的 另一种是只用 parent ,但好像也要指定名字,当然 pyqt 这样写运行会直接报错,不知道 C++如何 我习惯是继承并自定义类,限制了首个变量一定是 parent ,所以基本不会错 |
4 Bssn OP @NoOneNoBody #3 好的,感谢回复,不过 pyqt 和 c++在创建对象时还是不太一样,可能由于 python 变量太灵活了。我发的那个代码应该没什么问题,但不知道为什么会出现第二个菜单,奇奇怪怪的 bug... |
5 NoOneNoBody 198 天前 |
6 NoOneNoBody 198 天前 @Bssn #4 taskbar 在上面,看图没反应过来,只看到左上角的菜单, |
7 Bssn OP @NoOneNoBody #5 试了一下,把 `m_trayMenu = new QMenu(this);` 改为 `m_trayMenu = new QMenu;` 右击时还是会有两个菜单,太奇怪了。。。 |
8 Bssn OP @NoOneNoBody #6 不好意思,我应该拿个红框标一下 ![]() |
![]() | 9 SamsonWang 198 天前 `case QSystemTrayIcon::Context:`的时候啥都不用做,Qt 会自己把 context menu 显示出来 |
10 Bssn OP @SamsonWang 太厉害了,把这个 case 里面的东西删掉就真的只显示一个菜单了。不过还想请教个问题, `case QSystemTrayIcon::Trigger:` 按照这个 case 的逻辑, this 不是指向主面板吗?为什么单击的时候也会显示菜单呢? |
![]() | 11 SamsonWang 198 天前 QMenu 的 parent 是主面板,所以会随着主面板显示出来 |
12 Bssn OP @SamsonWang #11 懂了,感谢 |