QMenu:设置特定QAction的文本颜色

4

我有一个作为上下文菜单的QMenu,它看起来像这样:

Menu
- information_A
- information_B
- information_C

现在我想让条目 information_B 以不同的颜色显示,如何实现呢?


很难说某些事情不可能,但我会说它是不可能的。至少不是一件容易的事。我可能会忽略某些东西,但恐怕您必须对QMenu进行子类化并自己进行绘制,即重载QPaintEvent。 - Greenflow
我已经检查了QMenu的源代码,发现它调用了各种隐藏成员。所以我猜当使用LGPL时,没有办法使用现有的功能? - Zaiborg
我不知道。我检查了可用的API,没有找到可以轻松解决您的问题的东西。正如我所说,您可能需要自己子类化QMenu并重载QPaintEvent。这与LGPL无关。我只是认为这个看起来很简单的QMenu可能会出乎意料地难以绘制。我猜... <--你看到了很多猜测...你必须找到适当的矩形来绘制菜单项,并在活动样式的帮助下自己绘制它。现在,如果选择是我的话,我不会再费心去做这样的事情,而是使用qml。 - Greenflow
2个回答

5

编辑:我在这篇帖子中找到了最好的解决方案:链接 对于你的情况,只需要简单地执行以下操作:

QMenu contextMenu(this);
QString menuStyle(
        "QMenu::item{"      
        "color: rgb(0, 0, 255);"
        "}"
    );
contextMenu.setStyleSheet(menuStyle);

为了获得更多选项和可能性,请查看我上面提供的链接中的答案。
以前的解决方案:
您可以使用QWidgetAction代替QAction,定义具有所需文本和样式表的QLabel,然后将其分配给QWidgetAction。但请记住,您必须调整QLabel宽度高度,以使其看起来与QAction相同。
示例代码:
// label
QLabel *text = new QLabel(QString("your text here"), this);
text->setStyleSheet("color: blue"); 
// init widget action
QWidgetAction *widAct= new QWidgetAction(this);
widAct->setDefaultWidget(text);
contextMenu.addAction(widAct);

有点晚了,但我喜欢它 :) - Zaiborg
迟到总比不来得好 :) - Ion Ureche
QWigetAction类型的操作不会触发信号,也不会调用槽函数。 - mucisk
更新后的解决方案更改了所有项目的颜色,而OP询问了关于仅设置一个项目颜色的解决方案。 - rkudinov

1
如果您只想为菜单中的单个项目设置样式,可以使用QMenu::setDefaultAction将其设置为默认,并使用QMenu::item:default选择器为默认菜单项设置样式。

I.e.:

QMenu* menu = new QMenu("My menu");
QAction* actionToStyle = new QAction("My action");
menu->addAction(actionToStyle);
menu->setDefaultAction(actionToStyle);
menu->setStyleSheet("QMenu::item:default { color: #ff0000; }");

这种方法的限制在于它只能为一个项目应用特定的样式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接