首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将填充添加到Qt菜单项的宽度?

问如何将填充添加到Qt菜单项的宽度?
EN

Stack Overflow用户
提问于 2022-01-24 13:22:16
回答 1查看 297关注 0票数 0

基本上,我通过添加带有快捷方式的操作来使用Qt菜单。当菜单出现时,它们看起来很好。

但是我想在操作项文本和它的快捷方式之间添加更多的间距。这个是可能的吗?我找不到任何功能来做这个。

setMinimumWidth可以工作,但我需要在Qt计算的动态宽度的基础上添加。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-24 15:04:49

由于QMenu计算其大小的方式很复杂,使用setMinimumWidth()并不是一个可靠的选项:一旦设置了该大小,就无法取消它,而且sizeHint()将始终使用该最小值。

不过,有两种可能的解决办法。

强制菜单布局

这是有点烦琐和肮脏,可能不是所有的情况下都能很好地工作。诀窍是通过添加一个“假”动作来强制重新布局,这个动作将被立即移除。

可以通过将特定函数连接到aboutToShow和aboutToHide信号来做到这一点:

代码语言:javascript
复制
def resizeMenu(menu):
    for action in menu.actions():
        if action.shortcut():
            menu.setMinimumWidth(menu.sizeHint().width() + 50)
            menu.removeAction(menu.addAction(''))
            break

def restoreMenu(menu):
    menu.setMinimumWidth(0)
    menu.removeAction(menu.addAction(''))


menu.aboutToShow.connect(lambda: resizeMenu(menu))
menu.aboutToHide.connect(lambda: restoreMenu(menu))

您还可以在应用程序上安装一个事件筛选器,以便它可以用于所有菜单:

代码语言:javascript
复制
class MenuWatcher(QtCore.QObject):
    def eventFilter(self, obj, event):
        if isinstance(obj, QtWidgets.QMenu):
            if event.type() == event.Show:
                for action in obj.actions():
                    if action.shortcut():
                        menu.setMinimumWidth(menu.sizeHint().width() + 50)
                        menu.removeAction(menu.addAction(''))
                        break
            elif event.type() == event.Hide:
                if menu.minimumWidth():
                    menu.setMinimumWidth(0)
                    menu.removeAction(menu.addAction(''))
        return super().eventFilter(obj, event)

# ...
watcher = MenuWatcher()
app.installEventFilter(watcher)

使用QProxyStyle

通过重写一个sizeFromContents()的QProxyStyle,我们可以检查该选项是否是一个CT_MenuItem,如果它在其text中有一个tabWidth (指示至少一个先前的操作有一个快捷方式)或一个\t (意味着它可能有一个快捷方式),那么我们可以在返回默认实现提供的大小之前添加一个特定的宽度:

代码语言:javascript
复制
class ProxyStyle(QtWidgets.QProxyStyle):
    def sizeFromContents(self, ct, opt, size, widget=None):
        size = super().sizeFromContents(ct, opt, size, widget)
        if ct == self.CT_MenuItem and (opt.tabWidth or '\t' in opt.text):
            size.setWidth(size.width() + 50)
        return size

# ...
app.setStyle(ProxyStyle())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70834567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档