我有一个关联了QAbstractTableModel
的QTableView
,其中某些列包含目录名称。我想使用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() 调用并且启动非常小(这使得失去焦点的可能性更大)。如何更改对话框的大小?
setModelData
:我如何知道对话框是通过选择还是取消关闭的?在这两种情况下,setModelData
被调用时传递的值都相同。感到困惑... - DirkRQDialog::result()
返回的内容 - RobbieEsetModelData
中打印editor.result()
,我总是得到0
。我为此打开了一个新问题,谢谢! - DirkR