Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt QMenu下拉菜单方向_Python_Qt_Pyqt_Drop Down Menu_Qmenu - Fatal编程技术网

Python PyQt QMenu下拉菜单方向

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完

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

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

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


我在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上的图标,但它会给出正确的行为。