1

QFileDialogの一部の列のエディタとしてを使用しています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)

Chooseただし、エディターを閉じると、とCancel(またはフォーカスを失った)を区別する方法がわかりません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 に答える