2012-01-06 31 views
2

我正在尋找一種方法來控制從QMenu中打開子菜單的方向。默認行爲是向右打開,除非沒有足夠的屏幕空間,然後向左打開。PyQt QMenu下拉方向

如果屏幕最右側有一個菜單(例如:chrome的設置扳手),如果您有多個嵌套菜單,默認行爲將導致它們在從左側打開到打開從右邊看,這是一種瘋狂的用戶體驗。

我想要的是一種告訴QMenu總是打開子菜單到左邊的方法;在QMenu中絕對沒有直接的控制,但Qt經常爲特定於平臺的行爲設置很多神奇的「應用程序」或「全局」設置。我想知道有沒有人知道!

我在C#中使用ToolStripMenu完成了這個before,所以我知道一些工具包有這個能力。

回答

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

+0

這幾乎是一個整潔的解決方案,但它不能完全爲我工作在Linux上。頂層菜單打開到左側,但子菜單不會 - 即使我向其應用setLayoutDirection時也不會。 – ekhumoro 2012-01-06 17:38:13

+0

@ekhumoro:這很有趣。我在Ubuntu上測試了這個。無論我如何設定方向,他們都表現出「LeftToRight」。我甚至將'QApplication'的方向設置爲'RightToLeft',它應該傳播給孩子,它確實如此,但沒有運氣。也許Linux取決於語言環境取代了這個?雖然我不確定,因爲我不是一個Linux用戶...... – Avaris 2012-01-06 18:52:14

+0

這是我可以跨平臺工作的最佳解決方案。它不像C#那樣在LHS上顯示圖標,但它確實給出了正確的行爲。 – guyincognito 2012-05-21 23:30:29