2017-05-10 5 views
0

Je voudrais implémenter un menu contextuel personnalisé dans un QFileDialog. Dans le code ci-dessous, j'ai réussi à créer un menu contextuel à la fenêtre principale, mais je voudrais que le menu s'affiche lorsqu'un fichier est sélectionné: comment connaître le bon widget dans le QFileDialog Je devrais appliquer setContextMenuPolicy?menu contextuel dans QFileDialog

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Window(QWidget): 

    def __init__(self): 

     QWidget.__init__(self) 

     self.myFileDialog = QFileDialog() 

     self.myFileDialog.setContextMenuPolicy(Qt.CustomContextMenu) 
     self.myFileDialog.customContextMenuRequested.connect(self.openMenu) 

     layout = QVBoxLayout() 
     layout.addWidget(self.myFileDialog) 
     self.setLayout(layout) 

     self.action_perso = QAction("MyOwnMenu", self) 
     self.connect(self.action_perso, SIGNAL("triggered()"), self.test) 

    def openMenu(self, position): 
     menu = QMenu() 
     menu.addAction(self.action_perso) 
     menu.exec_(self.myFileDialog.mapToGlobal(position)) 

    def test(self): 
     print("coucou") 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

Répondre

0

J'ai trouvé une solution qui n'est peut-être pas la meilleure. Elle repose sur deux éléments:

  1. Remerciez à une fonction personnal objectTree (montré ici, mais non utilisé) qui répertorie récursive tous les objets enfants du QFileDialog, j'ai identifié le widget droit, à savoir le QTreeView (je compris que le QTreeView est le bon widget en essayant de masquer successivement tous les widgets QListView et QTreeView). Par conséquent, je peux le sélectionner par son objectName avec self.findChild(QTreeView, "treeView")

  2. Application de setContextMenuPolicy(Qt.ActionsContextMenu) à ce QTreeView. J'ai aussi essayé d'implémenter un setContextMenuPolicy(Qt.CustomContextMenu), et cela a fonctionné partiellement: mon menu est apparu mais sous le menu d'origine qui n'était pas inactif!
    est le code ci-dessous je vous propose:


import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class CustomWidget(QFileDialog): 
    def __init__(self, parent=None): 
     super(CustomWidget,self).__init__(parent) 

     # fetch the QTreeView in the QFileDialog 
     self.myTree = self.findChild(QTreeView, "treeView") 

     # set the context menu policy to ActionsContextMenu 
     self.myTree.setContextMenuPolicy(Qt.ActionsContextMenu) 

     # Define a new action 
     self.action_perso = QAction("MyOwnMenu", self.myTree) 
     self.myTree.addAction(self.action_perso) 

     # connect this action to a personnal function 
     self.connect(self.action_perso, SIGNAL("triggered()"), self.myFunction) 

    def myFunction(self): 
     print("coucou") 

    def objectTree(self, objet, plan, j): 
     """ list recursively all child objects of objet to fetch the right widget """ 

     n = len(objet.children()) 
     for i, child in enumerate(objet.children()): 
      #print("\t"*j, end="") 
      plan_sup = plan+"."+str(i) 
      #print(plan_sup, child) 
      if isinstance(child, QTreeView): 
       self.listViews.append(child) 
      self.objectTree(child, plan_sup, j+1) 


class MainWidget(QWidget): 

    def __init__(self, parent=None): 
     super(MainWidget,self).__init__(parent) 

     #creation of main layout 
     mainLayout = QVBoxLayout() 

     # creation of a widget inside 
     self.monWidget = CustomWidget() 
     mainLayout.addWidget(self.monWidget) 
     self.setLayout(mainLayout) 

     self.show() 


app = QApplication(sys.argv) 
window = MainWidget() 
sys.exit(app.exec_())