Qt QWidgetAction没有';t在QMenu中用作托盘的上下文菜单

Qt QWidgetAction没有';t在QMenu中用作托盘的上下文菜单,qt,Qt,我尝试在QMenu中插入QWidgetAction,它将用作托盘的上下文菜单。当我这样做的时候,我的菜单里只有一个空行 我正在使用Qt5.5.1。我在Plasma 5桌面环境(Linux)中工作 这是我的密码: action = new QWidgetAction(0); testw = new QWidget(); testl = new QLabel(QString("Test"), testw); action->setDefaultWidget(testw); menu.add

我尝试在QMenu中插入QWidgetAction,它将用作托盘的上下文菜单。当我这样做的时候,我的菜单里只有一个空行

我正在使用Qt5.5.1。我在Plasma 5桌面环境(Linux)中工作

这是我的密码:

action = new QWidgetAction(0);
testw = new QWidget();
testl = new QLabel(QString("Test"), testw);

action->setDefaultWidget(testw);

menu.addAction(action);
trayIcon.setContextMenu(&menu);
如果我使用
菜单.addAction(QString(“Test”))
-它会正确显示。 所有变量都是我的类的成员(如果这有任何意义的话)


感谢您的帮助

只要您已经显示了菜单,那么问题在于您包装QLabel的额外小部件。这是QWdigetAction通常的工作方式:

QWidgetAction* pWidgetAction = new QWidgetAction(0); // no parent-owner?
QLabel* pLabelWidget = new QLabel("Test");           // label widget
pWidgetAction->setDefaultWidget(pLabelWidget);       // label is a widget
menu.addAction(pWidgetAction);                       // add widget action
trayIcon.setContextMenu(&menu);                      // this I assume works

还不确定这些对象的生命周期(所有权)以及为什么
菜单
trayIcon
不是指针,但您应该更清楚这一点。默认情况下,我总是使用
new
创建UI对象,并将父窗口小部件/对象地址传递给构造函数,尽管我们也可以将它们放在堆栈上(不是灵活的方法)。

我认为这不可能奏效。应用程序不管理系统托盘图标的菜单;菜单的“描述”通过DBus序列化。因此,您不能在其中嵌入小部件。我已经尝试了@AlexanderVX和类似方法的解决方案,但(就像@peppe所说的)这在系统托盘中对我不起作用(我正在运行Lubuntu 14.04)。然而,我正在使用的解决方法——因为在我的例子中,我只需要显示文本——是调用
setDisabled
方法来执行
QAction
,我想将其用作标签!!工作起来很有魅力最好的一点是,它不需要对QWidgetAction进行不必要的细分。在Ubuntu19.10上的Qt5.12中,这个解决方案确实有效。