Python PyQt QMenu下拉菜单方向
我正在寻找一种方法来控制在QMenu中打开子菜单的方向。默认行为是向右打开,除非没有足够的屏幕空间,然后向左打开 如果屏幕最右侧有一个菜单(例如:chrome的设置扳手),如果有多个嵌套菜单,默认行为会导致它们在从左侧打开和从右侧打开之间来回ping,这是一种令人抓狂的用户体验 我想要的是告诉QMenu始终打开左侧的子菜单的方法;QMenu中肯定没有直接的控制,但是Qt通常有很多神奇的“应用程序”或“全局”设置,用于平台特定的行为。我想知道是否有人知道Python PyQt QMenu下拉菜单方向,python,qt,pyqt,drop-down-menu,qmenu,Python,Qt,Pyqt,Drop Down Menu,Qmenu,我正在寻找一种方法来控制在QMenu中打开子菜单的方向。默认行为是向右打开,除非没有足够的屏幕空间,然后向左打开 如果屏幕最右侧有一个菜单(例如:chrome的设置扳手),如果有多个嵌套菜单,默认行为会导致它们在从左侧打开和从右侧打开之间来回ping,这是一种令人抓狂的用户体验 我想要的是告诉QMenu始终打开左侧的子菜单的方法;QMenu中肯定没有直接的控制,但是Qt通常有很多神奇的“应用程序”或“全局”设置,用于平台特定的行为。我想知道是否有人知道 我在C#中使用ToolStripMenu完
我在C#中使用ToolStripMenu完成了这项工作,因此我知道有些工具包具有此功能。我可以想到一个选项。您可以通过
setLayoutDirection(QtCore.Qt.RightToLeft)
设置特定菜单的方向,如果有空间,它将始终向左扩展
不过,我必须说,当顶级菜单从左到右对齐时,它看起来并不漂亮,而as子菜单是从右到左对齐的。至少,不是在我的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
。@ekhumaro:这很有趣。我在Ubuntu上测试了这个。无论我如何设置方向,它们的行为都是左向右。我甚至将QApplication
的方向设置为right-toleft
,这应该会传播给孩子们,确实如此,但运气不好。也许Linux会根据区域设置覆盖这一点?尽管我不确定,因为我不是一个Linux用户……这是我能够以跨平台方式工作的最好解决方案。它不会像C#那样显示LHS上的图标,但它会给出正确的行为。