Qt5 托盘菜单右击时的异常

160 天前
 Bssn

程序运行在 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;
    }
}

1310 次点击
所在节点    Qt
12 条回复
NoOneNoBody
160 天前
trayMenu 要绑定 trayIcon ,没有绑定的话它只是个一般 menu
Bssn
160 天前
@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*)));

}

```
NoOneNoBody
160 天前
我是写 pyqt ,C++只能约莫看懂
看上去没太大问题,不过建议 trayicon/traymenu 创建时,parent 指定变量名,因为创建对象有多种方式,我写 pyqt 防止出错都写上 parent=xxx 的
QSystemTrayIcon 可以是第一个变量 icon ,parent 默认用 null 创建的
另一种是只用 parent ,但好像也要指定名字,当然 pyqt 这样写运行会直接报错,不知道 C++如何
我习惯是继承并自定义类,限制了首个变量一定是 parent ,所以基本不会错
Bssn
160 天前
@NoOneNoBody #3 好的,感谢回复,不过 pyqt 和 c++在创建对象时还是不太一样,可能由于 python 变量太灵活了。我发的那个代码应该没什么问题,但不知道为什么会出现第二个菜单,奇奇怪怪的 bug...
NoOneNoBody
160 天前
@Bssn #4
如果是两个菜单,那反而很明显,出现两个应该是创建时设了一个 parent ,后面又绑定了另一个
应该创建菜单时不给 parent (无参数),反正后面会另外绑定
NoOneNoBody
160 天前
@Bssn #4
taskbar 在上面,看图没反应过来,只看到左上角的菜单,😅
Bssn
159 天前
@NoOneNoBody #5 试了一下,把 `m_trayMenu = new QMenu(this);` 改为 `m_trayMenu = new QMenu;` 右击时还是会有两个菜单,太奇怪了。。。
Bssn
159 天前
@NoOneNoBody #6 不好意思,我应该拿个红框标一下
SamsonWang
159 天前
`case QSystemTrayIcon::Context:`的时候啥都不用做,Qt 会自己把 context menu 显示出来
Bssn
159 天前
@SamsonWang 太厉害了,把这个 case 里面的东西删掉就真的只显示一个菜单了。不过还想请教个问题, `case QSystemTrayIcon::Trigger:` 按照这个 case 的逻辑, this 不是指向主面板吗?为什么单击的时候也会显示菜单呢?
SamsonWang
159 天前
QMenu 的 parent 是主面板,所以会随着主面板显示出来
Bssn
159 天前
@SamsonWang #11 懂了,感谢👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1121030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX