QFileDialog中的上下文菜单

时间:2017-05-10 10:40:40

标签: python pyqt pyqt4 contextmenu qfiledialog

我想在QFileDialog中实现自定义上下文菜单。在下面的代码中,我设法为主窗口创建了一个上下文菜单,但是我希望在选择文件时显示菜单:如何知道QFileDialog中的正确小部件我应该应用setContextMenuPolicy

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_())

1 个答案:

答案 0 :(得分:0)

我找到了一个可能不是最好的解决方案。它依赖于两个要素:

  1. 感谢人工函数objectTree(此处显示但未使用)以递归方式列出QFileDialog的所有子对象,我确定了正确的小部件,即QTreeView (我知道QTreeView是试图隐藏所有QListView和QTreeView小部件的正确小部件)。因此,我可以通过其objectName self.findChild(QTreeView, "treeView"

  2. 来选择它
  3. setContextMenuPolicy( Qt.ActionsContextMenu )在此QTreeView中的应用。我还试图实现一个setContextMenuPolicy(Qt.CustomContextMenu),它部分工作:我的菜单确实出现了,但在原始菜单下没有被取消激活!
    以下是我建议的代码:

  4. 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_())