【问题标题】:PyQt QMenu dropdown directionPyQt QMenu 下拉方向
【发布时间】:2012-02-03 22:54:30
【问题描述】:

我正在寻找一种方法来控制从 QMenu 中打开子菜单的方向。默认行为是向右打开,除非没有足够的屏幕空间,否则向左打开。

如果您有一个位于屏幕最右侧的菜单(例如:chrome 的设置扳手),如果您有多个嵌套菜单,默认行为会导致它们在从左侧打开和从左侧打开之间来回切换正确的,这是一种令人抓狂的用户体验。

我想要一种告诉 QMenu 始终向左打开子菜单的方法;在 QMenu 中绝对没有直接的控制,但 Qt 通常有很多神奇的“应用程序”或“全局”设置,用于特定于平台的行为。我想知道是否有人知道!

我在 C# 中使用 ToolStripMenu 完成了这个before,所以我知道有些工具包有这个能力。

【问题讨论】:

    标签: python qt pyqt drop-down-menu qmenu


    【解决方案1】:

    我能想到一个选项。您可以通过setLayoutDirection(QtCore.Qt.RightToLeft) 设置特定菜单的方向,如果有空间,它将始终向左扩展。

    不过,我必须说,当顶级菜单从左到右对齐时,它看起来并不漂亮,而子菜单从右到左对齐。至少,不是在我的 Windows 7 上:

    import sys
    from PyQt4 import QtGui, QtCore
    
    app = QtGui.QApplication(sys.argv)
    main = QtGui.QMainWindow()
    menubar = QtGui.QMenuBar()
    
    menus = []
    submenus = {}
    for x in range(10):
        # top menus
        menu = QtGui.QMenu('Top %d' % x)
        menus.append(menu)
    
        # set direction
        menu.setLayoutDirection(QtCore.Qt.RightToLeft)
    
        # add to menubar
        menubar.addMenu(menu)
    
        for y in range(5):
            # a sub-menu
            submenu = QtGui.QMenu('Level 1 - %d' % y)
    
            # some dummy actions
            submenu.addAction('Level 2 - 1')
            submenu.addAction('Level 2 - 2')
    
            # keep reference
            submenus[(x,y)] = submenu
            # add to the top menu
            menu.addMenu(submenu)
    
    main.setMenuBar(menubar)
    main.show()
    
    sys.exit(app.exec_())
    

    【讨论】:

    • 这几乎是一个简洁的解决方案,但它在 Linux 上并不完全适合我。顶级菜单向左打开,但子菜单不会 - 即使我将setLayoutDirection 应用于它们。
    • @ekhumoro:这很有趣。我在 Ubuntu 上对此进行了测试。不管我如何设定方向,他们都表现得像LeftToRight。我什至将QApplication 的方向设置为RightToLeft,它应该传播给孩子们,它确实如此,但没有运气。也许Linux会根据语言环境覆盖它?虽然我不确定,因为我不是 Linux 用户......
    • 这是我能以跨平台方式工作的最佳解决方案。它不像 C# 那样在 LHS 上显示图标,但它确实提供了正确的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2010-11-30
    • 2017-01-16
    • 2013-12-21
    相关资源
    最近更新 更多