【问题标题】:QFileDialog as editor for TableView closes when losing focusQFileDialog 作为 TableView 的编辑器在失去焦点时关闭
【发布时间】:2014-04-04 14:58:28
【问题描述】:

我有一个 QTableView 和关联的 QAbstractTableModel,其中包含某些列中的目录名称。我想使用QFileDialog 作为编辑器来更改这些列。这有点不寻常,因为编辑器不会在表格单元格内(空间不足)。

我使用QStyledItemDelegate 了解了基础知识:

class DirectorySelectionDelegate(QStyledItemDelegate):

    def createEditor(self, parent, option, index):        
        editor = QFileDialog(parent)
        editor.setFileMode(QFileDialog.Directory)       
        editor.resize(400, 400)
        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())

双击单元格时,它会启动QFileDialog,我可以选择我想要的目录,然后在模型中设置选择它。

但是,如果由于某种原因QFileDialog 失去焦点,它将被关闭,并且数据被设置为原始值。我希望在用户单击“取消”或“选择”之前打开对话框,但我找不到这样做的方法。

额外问题:由于某种原因,对话框忽略了resize() 调用并且开始时非常小(这使得失去焦点的可能性更大)。如何更改对话框的大小?

【问题讨论】:

    标签: python qt delegates editor tableview


    【解决方案1】:

    这是预期的行为。

    标准视图不是小部件的容器,每个单元格都是在必要时绘制的。用于编辑的小部件仅在生成编辑触发器时创建并叠加在视图顶部。然后调用委托来创建适当的编辑小部件,并将单元格的位置和大小作为参数传入。

    视图保留编辑器小部件的所有权,因为一旦失去焦点,您显然无法再进行编辑,因此视图会删除编辑器。

    如果您没有在 setModelData 函数中回传任何内容,则模型将不会更新。说模型被设置回原始数据是不正确的,因为它从一开始就没有改变。

    我建议您尝试将 QFileDialog 设置为模态打开 (editor.setModal(true)),以便在焦点转移到另一个小部件之前必须关闭对话框。

    【讨论】:

    • 感谢您的快速回答!我试过了,它有一点帮助,因为它不会将焦点返回给我的应用程序,但如果另一个应用程序获得焦点,编辑器仍然关闭。但听起来这就是它应该做的,所以我不得不忍受它。
    • 关于setModelData:如何判断对话框是用选择还是取消关闭的? setModelData 在两种情况下都使用相同的值调用。迷茫...
    • 通过检查你从QDialog::result()得到什么
    • 嗯,我在 QFileDialog 的 PyQT 文档中看不到这一点,如果我在 setModelData 中打印 editor.result(),我总是得到 0。我为此开了一个new question。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多