使 QMenu 标签加粗而不影响其子项
Posted
技术标签:
【中文标题】使 QMenu 标签加粗而不影响其子项【英文标题】:Make a QMenu label bold without affecting its children 【发布时间】:2014-09-25 08:48:13 【问题描述】:我正在尝试更改 QMenu 上标签/文本的样式和/或字体,而不影响其子项。我在 Python 中使用 PySide 执行此操作(其工作方式与 Qt 类似)。
我试过了:
menu = QtGui.QMenu()
f = menu.font()
f.setBold(True)
menu.setFont(f)
和
menu = QtGui.QMenu()
menu.setStyleSheet("QMenufont-weight: bold;")
这两种方法都不会更改菜单本身的标签,但会在其所有子项上进行。
我宁愿直接在 QMenu 上设置样式(或另一个类,如果它的作用相似并且可以实现的话),而不是在其父级上应用样式表。
目标
我的想法是我有一个包含各种子菜单的菜单(根据服务器上的文件夹有些动态),其中一些需要粗体和一些斜体。因此,我想动态添加这些子 QMenu 并相应地设置它们的样式。
【问题讨论】:
不清楚,样式表代码目前是否适合您,但您想在没有样式表的情况下达到所需的效果? 在那之后你会如何处理menu
对象? menu.exec 还是什么?你把它放在哪里?您想在哪里看到粗体字?
@N1ghtLight:如前所述,使用 setStyleSheet 会产生与调整字体相同的输出。两者都不是我想要的。
@Ezee:我将它作为子菜单添加到另一个菜单中,并且想要一个粗体/斜体子菜单项的变体并单独设置它们的样式(它们拥有自己的菜单项,所以它是一个 QMenu)跨度>
【参考方案1】:
您可以轻松实现。理解逻辑:
QMenu
- 是一个显示项目的小部件
当您将QMenu
添加到另一个QMenu
时,QMenu::menuAction
被放置在基本菜单中。
如果您想自定义子菜单添加到基本菜单时的外观,您需要自定义menuAction
。
因此,要使您的菜单加粗,您只需将此菜单的menuAction
设置为粗体。
这是一个简单的工作示例:
QMenu m; //base menu
QMenu sub; //sub menu
sub.setTitle("subMenu");
QAction* a1 = new QAction("act1", &m);
QAction* a2 = new QAction("act2", &m);
QAction* a3 = new QAction("act3", &m);
// set a bold font for a sub menu item
QFont f = sub.menuAction()->font();
f.setBold(true);
sub.menuAction()->setFont(f);
// add an action to the sub menu
sub.addAction(a3);
// add two actions and the sub menu to the base menu
m.addAction(a1);
m.addMenu(&sub);
m.addAction(a2);
// show the base menu
m.exec(QCursor::pos());
【讨论】:
【参考方案2】:阅读关于 QSS selectors 的 Qt 文档。
对于您的情况:您无法直接自定义特定菜单项的标签。但是您可以在QAction
中插入QWidgetAction
并根据需要对其进行自定义(在QWidgetAction
上放置标签并对其进行自定义)。
【讨论】:
QWidgetAction 能否充当一个普通的“子菜单”,包含子 QMenuItem 和 QMenu? 是的,一切都取决于您如何自定义内部小部件。 你不会得到确切的行为,但你可以通过付出很多努力来接近它。以上是关于使 QMenu 标签加粗而不影响其子项的主要内容,如果未能解决你的问题,请参考以下文章