2012-01-06 5 views
2

Je cherche un moyen de contrôler le sens d'ouverture des sous-menus dans un menu QMenu. Le comportement par défaut est d'ouvrir vers la droite, sauf s'il n'y a pas assez d'écran d'écran, puis d'ouvrir vers la gauche. Si vous avez un menu qui se trouve à l'extrême droite de l'écran (exemple: la clé de paramètres de chrome), si vous avez plusieurs menus imbriqués, le comportement par défaut les oblige à effectuer un ping entre l'ouverture de gauche et l'ouverture de la droite, ce qui est une expérience utilisateur exaspérante.PyQt QMenu direction de la liste déroulante

Ce que j'aimerais, c'est un moyen de dire à QMenu d'ouvrir toujours les sous-menus à GAUCHE; Il n'y a certainement pas de contrôle direct pour cela dans QMenu, mais Qt a souvent beaucoup de paramètres 'application' ou 'globaux' magiques pour un comportement spécifique à la plate-forme. Je me demandais si quelqu'un savait!

J'ai fait cela before en C# en utilisant ToolStripMenu, donc je sais que certains toolkits ont cette capacité.

Répondre

3

Il y a une option que je peux penser. Vous pouvez définir la direction d'un menu particulier via setLayoutDirection(QtCore.Qt.RightToLeft) et il s'étendra toujours vers la gauche s'il y a de la place. Bien que, je dois le dire, il ne semble pas joli quand les menus de haut niveau alignés de gauche à droite, où les sous-menus sont de droite à gauche. Au moins, pas sur mon 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

C'est presque une solution propre, mais il ne fonctionne pas bien pour moi sur Linux. Le menu de niveau supérieur s'ouvre à gauche, mais les sous-menus ne le font pas - même si je leur applique la commande «setLayoutDirection». – ekhumoro

+0

@ekhumoro: C'est intéressant. J'ai testé cela sur Ubuntu. Indépendamment de la façon dont j'ai défini la direction, ils se sont tous comportés 'LeftToRight'. Je mets même la direction de 'QApplication' à' RightToLeft', qui devrait se propager aux enfants et c'est le cas, mais pas de chance. Peut-être que Linux remplace cela en fonction des paramètres régionaux? Bien que je ne sois pas sûr, puisque je ne suis pas un utilisateur de Linux ... – Avaris

+0

C'est la meilleure solution que je pourrais avoir pour travailler de manière multi-plateforme. Il ne montre pas les icônes sur le LHS comme le fait C#, mais il donne le comportement correct autrement. – guyincognito

Questions connexes