【发布时间】: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