2010-09-22 7 views
0

J'écris dans Qt 4.6. Je me demande s'il est possible de réaliser un tel élément de menu, qu'il est possible de le déclencher, mais aussi d'avoir un sous-menu. En cliquant dessus, vous déclenchez l'action associée, en la faisant glisser, le sous-menu apparaît.Élément de menu cliquable avec sous-menu dans Qt

+2

Même si cela est possible, serait-ce vraiment une bonne idée de s'écarter d'un comportement si commun? Personnellement, je suis très habitué à ne jamais avoir besoin de cliquer sur l'entrée qui contient le sous-menu sauf si je veux réellement que le sous-menu apparaisse plus vite. Ce comportement alternatif serait surprenant si j'étais l'utilisateur. – TheUndeadFish

Répondre

0

Ce comportement est un peu confus, mais je suis en train de développer une interface utilisateur avec aussi peu que possible en cliquant. Bien qu'un peu inattendu, ce comportement le rend un peu plus rapide à utiliser lorsque vous y êtes habitué.

Je n'ai pas écrit ça dans mon précédent message, mais j'écris en C++, et je n'ai aucune idée de python ... De toute façon j'ai réussi à traduire idée en C++, et ça marche mais c'est moche. . J'ai trouvé un peu meilleure approche en regardant à travers la source qt (quand je demandais cette question, j'espérais il y a une meilleure méthode « destinée »)

class MyMenu : public QMenu 
{ 
Q_OBJECT 
public: 
    MyMenu(QWidget* parent); 

    ~MyMenu(); 

    virtual void mouseReleaseEvent(QMouseEvent * event); 

}; 

MyMenu::MyMenu(QWidget* parent):QMenu(parent) 
{ 
} 

MyMenu::~MyMenu() 
{ 
} 

void MyMenu::mouseReleaseEvent(QMouseEvent * event){ 
    QAction* act = menuAction(); 
    if (act){ 
    QMenu* men = act->menu(); 
    act->setMenu(0); 

    QMenu::mouseReleaseEvent(event); 
    act->setMenu(men); 
    }else{ 
    QMenu::mouseReleaseEvent(event); 
    } 
} 

Le seul inconvénient est qu'un tel menu réagirait à en cliquant sur toutes les options avec des sous-menus, pas seulement ceux souhaités. Peut-être que ce serait une bonne idée de vérifier si quelque chose est connecté aux signaux d'action?

Sur mes ubuntu ça marche. Cependant, je suppose que cela ne fonctionnerait pas sur les fenêtres, où le système gère les menus exclusivement (à moins que qt utilise des fenêtres avec le regard de menu et se sentir, pas de menus du système), mais je suis trop paresseux pour installer les fenêtres juste pour vérifier;)

1

Permettez-moi de commencer par dire que ce n'est pas un bon plan d'attaque. Il y a des cas de coin ici qui prendront une quantité ridicule de temps et de code pour obtenir juste, et exigeront probablement la personnalisation par système d'exploitation.

Cela dit, cependant, la mise en œuvre effective est pas trop compliqué. Il suffit de sous-classer le QMenu à partir duquel vous créez votre sous-menu et de surcharger les gestionnaires d'événements, en forçant le menu parent à se fermer lorsqu'une «sélection» est faite. Quelque chose comme ce qui suit fonctionne essentiellement:

from PyQt4 import QtCore, QtGui 
import sys 

app = QtGui.QApplication(sys.argv) 
widget = QtGui.QMainWindow() 
widget.resize(250,150) 
menu = widget.menuBar().addMenu("test") 

class submenu(QtGui.QMenu):     #Override the submenu class 
    def __init__(self,name): 
     QtGui.QMenu.__init__(self,name) 
    def mouseReleaseEvent(self,event): #catch mouseRelease Events 
     global menu 
     QtGui.QMenu.mouseReleaseEvent(self,event) 
     if not self.rect().contains(event.pos()): 
      print("Parent Selected") 
      menu.hide()     #If the parent was selected, hide it 
     else:       #Likely ignore these 
      print("Parent NOT Selected") 

def c(): 
    print("Sub-item selected") 
cMenu = submenu("Sub-menu") 
menu.addMenu(cMenu) 
actionC = QtGui.QAction("sub-item",widget) 
actionC.triggered.connect(c) 
cMenu.addAction(actionC) 

widget.show() 

sys.exit(app.exec_()) 
Questions connexes