gpt4 book ai didi

python - QFileDialog 作为 TableView 的编辑器在失去焦点时关闭

转载 作者:行者123 更新时间:2023-11-28 16:38:32 25 4
gpt4 key购买 nike

我有一个 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() 调用并开始时非常小(这使得失去焦点的可能性更大)。如何更改对话框的大小?

最佳答案

这是预期的行为。

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

View 保留了编辑器小部件的所有权,因为每当失去焦点时,您显然无法再进行编辑,因此 View 会删除编辑器。

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

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

关于python - QFileDialog 作为 TableView 的编辑器在失去焦点时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com