2017-05-10 17 views
0

QFileDialog에서 사용자 지정 컨텍스트 메뉴를 구현하고 싶습니다. 아래의 코드에서 주 창에 컨텍스트 메뉴를 만들 수 있었지만 파일을 선택할 때 메뉴를 표시하고 싶습니다. QFileDialog에서 올바른 위젯을 확인하는 방법 setContextMenuPolicy을 적용해야합니까?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_()) 

답변

0

해결책이 가장 좋지 않을 수 있습니다. 그것은 두 가지 요소에 의존 다음 QFileDialog의 재귀 적으로 모든 자식 개체를 나열하는 personnal 기능 objectTree (여기가 아니라 같이 사용)에 대한 감사합니다, 나는 QTreeView 즉, 올바른 위젯을 확인

  1. (나는 이해 그 QTreeView는 모든 QListView 및 QTreeView 위젯을 연속적으로 숨겨서 올바른 위젯입니다.) 따라서 self.findChild(QTreeView, "treeView"과 함께 objectName으로 선택할 수 있습니다.

  2. 이 QTreeView에 응용 프로그램을 적용 할 수 있습니다. 나는 또한 setContextMenuPolicy(Qt.CustomContextMenu)을 구현하려고 시도했지만 부분적으로 작동했습니다. 내 메뉴가 나타나지만 활성화되지 않은 원래 메뉴 아래에있었습니다!


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_()) 
:
아래 내가 제안하는 코드입니다