Направление выпадающего меню PyQt QMenu - PullRequest
2 голосов
/ 06 января 2012

Я ищу способ управления направлением открытия подменю в QMenu. Поведение по умолчанию - открыть справа, если на экране недостаточно места, а затем открыть слева.

Если у вас есть меню, которое находится в правой части экрана (например: ключ настроек Chrome), если у вас есть несколько вложенных меню, поведение по умолчанию заставляет их переключаться между открытием слева и открытием право, которое сводит с ума пользовательский опыт.

Мне бы хотелось, чтобы QMenu всегда открывал подменю LEFT; в QMenu определенно нет прямого контроля за этим, но Qt часто имеет множество волшебных «приложений» или «глобальных» настроек для поведения платформы. Мне было интересно, если бы кто-нибудь знал!

Я сделал это до в C #, используя ToolStripMenu, так что я знаю, что некоторые инструменты имеют эту возможность.

1 Ответ

3 голосов
/ 06 января 2012

Есть один вариант, который я могу придумать.Вы можете установить конкретное направление меню с помощью 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

...