1

我使用 aQFileDialog作为 a 中某些列的编辑器QTableView。这基本上有效(以一些焦点问题为模,请参见此处):

class DirectorySelectionDelegate(QStyledItemDelegate):    
    def createEditor(self, parent, option, index):
        editor = QFileDialog(parent)
        editor.setFileMode(QFileDialog.Directory)       
        editor.setModal(True)
        return editor    

    def setEditorData(self, editor, index):
        val = index.model().data(index, Qt.DisplayRole)
        fs = val.rsplit(os.path.sep, 1)
        if len(fs) == 2:
            bdir, vdir = fs
        else:
            bdir = "."
            vdir = fs[0]

        editor.setDirectory(bdir)        
        editor.selectFile(vdir)        

    def setModelData(self, editor, model, index):
        model.setData(index, editor.selectedFiles()[0])   

    def updateEditorGeometry(self, editor, option, index):
        r = option.rect
        r.setHeight(600)
        r.setWidth(600)            
        editor.setGeometry(r)

但是,当编辑器关闭时,我看不到区分ChooseCancel(或失去焦点)的方法,setEditorData在所有情况下都会调用该函数。我看不到从中获得结果的方法,QFileDialog因为editor我可以找到的所有示例都使用exec_我无权访问的返回值。

4

1 回答 1

2

setModelData中,您似乎可以在设置模型数据之前检查编辑器的结果。默认情况下,结果是QDialog.Rejected,并且只有在用户实际选择文件时才会改变:

    def setModelData(self, editor, model, index):
        if editor.result() == QtGui.QDialog.Accepted:
            model.setData(index, editor.selectedFiles()[0])   

更新

经过一些迟来的测试,很明显无论文件对话框如何运行(即使使用exec),它result都不会在委托编辑器的上下文中正确重置。所以需要一点间接性。根据QFileDialog.filesSelected的文档,此信号将始终且仅在接受对话框时发送(即使没有选定的文件)。所以我们可以使用这种机制来强制正确的对话结果,像这样:

class DirectorySelectionDelegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QtGui.QFileDialog(parent)
        editor.filesSelected.connect(
            lambda: editor.setResult(QtGui.QDialog.Accepted))
        ...

    def setModelData(self, editor, model, index):
        print(editor.result())
        if editor.result() == QtGui.QDialog.Accepted:
            model.setData(index, editor.selectedFiles()[0])
于 2014-04-04T17:28:04.980 回答