简体   繁体   English

QFileDialog 中的多个文件和文件夹选择(重访)

[英]Multiple files and folder selection in QFileDialog (Revisited)

This question already exists here , but the answer appears outdated or no longer works as of Python 2.7.这个问题已经存在here ,但答案似乎已经过时或从 Python 2.7 开始不再有效。

When I use this code to subclass my QFileDialog, the FileDialog class init is called, but the openClicked method is never called.当我使用此代码对 QFileDialog 进行子类化时,会调用 FileDialog 类 init,但从未调用过 openClicked 方法。

class FileDialog(QtGui.QFileDialog):
    def __init__(self, *args):
        QtGui.QFileDialog.__init__(self, *args)
        self.setOption(self.DontUseNativeDialog, True)
        self.setFileMode(self.ExistingFiles)
        btns = self.findChildren(QtGui.QPushButton)
        self.openBtn = [x for x in btns if 'open' in str(x.text()).lower()][0]
        self.openBtn.clicked.disconnect()
        self.openBtn.clicked.connect(self.openClicked)
        self.tree = self.findChild(QtGui.QTreeView)

    def openClicked(self):
        inds = self.tree.selectionModel().selectedIndexes()
        files = []
        for i in inds:
            if i.column() == 0:
                files.append(os.path.join(str(self.directory().absolutePath()),str(i.data().toString())))
        self.selectedFiles = files
        self.hide()

    def filesSelected(self):
        return self.selectedFiles

Is this the correct call for FileDialog?这是对 FileDialog 的正确调用吗?

mydialog = FileDialog()
filelist = mydialog.getExistingDirectory(self, "Select Stuff", "", QtGui.QFileDialog.DontConfirmOverwrite) 

The solution from the other question is unnecessarily complicated.另一个问题的解决方案不必要地复杂。 All you need to do is override QFileDialog.accept() , and then you are free to implement whatever behaviour you like.您需要做的就是覆盖QFileDialog.accept() ,然后您就可以自由地实现您喜欢的任何行为。

The example below is very minimal.下面的例子非常小。 It doesn't do any checking of the selected files (like seeing whether they still exist), but that could easily be added if necessary.它不会对所选文件进行任何检查(例如查看它们是否仍然存在),但如果需要,可以轻松添加。

from PyQt4 import QtCore, QtGui

class FileDialog(QtGui.QFileDialog):
    def __init__(self, *args, **kwargs):
        super(FileDialog, self).__init__(*args, **kwargs)
        self.setOption(QtGui.QFileDialog.DontUseNativeDialog, True)
        self.setFileMode(QtGui.QFileDialog.ExistingFiles)

    def accept(self):
        super(FileDialog, self).accept()

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtGui.QPushButton('Test', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)

    def handleButton(self):
        dialog = FileDialog()
        if dialog.exec_() == QtGui.QDialog.Accepted:
            print(dialog.selectedFiles())

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM