2012-01-06 9 views
2

QMenu에서 하위 메뉴가 열리는 방향을 제어하는 ​​방법을 찾고 있습니다. 기본 동작은 화면 공간이 충분하지 않은 경우가 아니면 오른쪽으로 열어 왼쪽으로 엽니 다.PyQt QMenu 드롭 다운 방향

여러 개의 중첩 된 메뉴가있는 경우 화면 맨 오른쪽에있는 메뉴 (예 : Chrome의 설정 렌치)가있는 경우 기본 동작으로 인해 왼쪽에서 열리고 여는 사이에 앞뒤로 핑이 수행됩니다 오른쪽에서 보면 미친 사용자 경험입니다.

내가 원하는 것은 항상 왼쪽으로 하위 메뉴를 여는 QMenu를 알려주는 것입니다. QMenu에서 직접 제어 할 수는 없지만, Qt는 종종 플랫폼 특정 동작에 대한 많은 "응용 프로그램"또는 "전역"설정을 가지고 있습니다. 아무도 모른다면 나는 궁금해했다!

나는 ToolStripMenu를 사용하여 C#에서 before을 수행 했으므로 일부 툴킷에는이 기능이 있습니다.

답변

3

내가 생각할 수있는 옵션이 하나 있습니다. setLayoutDirection(QtCore.Qt.RightToLeft)을 통해 특정 메뉴의 방향을 설정할 수 있으며, 공간이 있으면 항상 왼쪽으로 확장됩니다.

최상위 메뉴가 왼쪽에서 오른쪽으로 정렬되면 하위 메뉴가 오른쪽에서 왼쪽으로 정렬 될 때보기에는 좋지 않지만 말해야합니다. 적어도, 나의 윈도우 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

+0

이 거의 깔끔한 솔루션이지만, 완전히 리눅스에서 나를 위해 작동하지 않습니다. 최상위 메뉴는 왼쪽으로 열리지 만 하위 메뉴는 'setLayoutDirection'을 적용해도 예외가 아닙니다. – ekhumoro

+0

@ekhumoro : 재미 있습니다. 나는 이것을 우분투에서 테스트했다. 내가 방향을 어떻게 잡았는지에 상관없이 그들은 모두 'LeftToRight'를 행동했다. 나는'QApplication'의 방향을'RightToLeft'로 설정했습니다. RightToLeft는 아이들에게 전달되어야하지만 행운은 없습니다. 어쩌면 리눅스가 로케일에 따라 이것을 무시할 수 있습니까? 비록 내가 잘 모르겠지만 리눅스 유저가 아니기 때문에 ... – Avaris

+0

이것은 크로스 플랫폼 방식으로 작업 할 수있는 최상의 솔루션입니다. C#과 같은 방식으로 LHS에 아이콘을 표시하지 않지만 그렇지 않으면 올바른 동작을 제공합니다. – guyincognito

관련 문제