使 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 标签加粗而不影响其子项的主要内容,如果未能解决你的问题,请参考以下文章

如何使 TabPage 的标题文本加粗?

使 ZPL 标签中的文本加粗或加下划线?

QMenu mousePressEvent 阻碍了 QAction 切换

HTML <sup /> 标签影响行高,如何使其保持一致?

html标签对SEO 优化都有哪些影响

如何在UI标签中将字符串的一部分加粗