PyQt QMenu 下拉方向

2 投票
1 回答
5908 浏览
提问于 2025-04-17 09:39

我想找到一种方法来控制QMenu中子菜单打开的方向。默认情况下,子菜单是向右打开的,只有在屏幕空间不够时,才会向左打开。

如果你的菜单在屏幕的最右边(比如:Chrome的设置图标),当你有几个嵌套的菜单时,默认的行为会导致它们在左边和右边之间来回切换,这样的用户体验真的很糟糕。

我希望能有一种方法让QMenu的子菜单总是向左打开;虽然QMenu中没有直接的控制选项,但Qt通常会有一些神奇的“应用”或“全局”设置来处理特定平台的行为。我在想有没有人知道这个!

我之前在C#中使用ToolStripMenu做过这个,所以我知道有些工具包是可以做到的。

1 个回答

3

我想到一个办法。你可以通过 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_())

enter image description here

撰写回答