reclosedev
Похоже вот на это http://python.su/forum/post/88673/
Спасибо. Попробовала. Не помогло. Возможно я что-то сделала не так.
В приведённом (по ссылке) примере комбобокс сам является делегатом, а из него вызывается диалог.
У меня для QTreeView назначен делегат:
class ColorDelegate(QtGui.QItemDelegate): def __init__(self, treeD, parent=None): super(ColorDelegate, self).__init__(parent) self.treeD = treeD #виджет, помещённый в QDockWidget self.newcolor = QtGui.QColor() self.fullName = "" def createEditor(self, parent, option, index): editor = ColorDialog(self.treeD) editor.accepted.connect(self.emitColorData) editor.rejected.connect(self.rejectColorData) editor.installEventFilter(self) editor.canFocusOut = True return editor def setEditorData(self, editor, index, value): # editor.canFocusOut = False editor.setFocus() print "ColorDelegate> setEditorData: editor.canFocusOut=", editor.canFocusOut color = QtGui.QColor(value) if color.isValid(): editor.setCurrentColor(color) def setModelData(self, editor, model, index, scene): self.scene = scene row = index.row() self.ind = index.sibling(row, config.AttrNameColumnNumber) indN = index.sibling(row, config.AttrFullNameColumnNumber) self.fullName = EgcString(index.model().data(indN, QtCore.Qt.DisplayRole)) self.newcolor = editor.currentColor() def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect) def emitColorData(self): objName = self.treeD.getCurrObjName() script = "sets(\""+ objName + "." + self.fullName +"\"," + "\"" + str(self.newcolor.name()) + "\")" EgcJouExecScript(self.scene, script) self.treeD.setNeedUpdateAttrTree() EgcDrawPicture(self.scene) self.commitData.emit(self.sender()) def rejectColorData(self): self.result = QtGui.QDialog.Rejected def eventFilter(self, editor, event): # print "ColorDelegate> eventFilter: editor.canFocusOut=", editor.canFocusOut, "event=", event if event.type() == QtCore.QEvent.FocusOut and hasattr(editor, 'canFocusOut'): print "ColorDelegate> -1- eventFilter: editor.canFocusOut=", editor.canFocusOut if not editor.canFocusOut: return False return QtGui.QItemDelegate.eventFilter(self, editor, event)
class ColorDialog(QtGui.QColorDialog): def __init__(self, parent=None): super(ColorDialog, self).__init__(parent) self.setWindowModality(QtCore.Qt.ApplicationModal) self.canFocusOut = False # self.canFocusOut = True def accept(self): self.done(QtGui.QDialog.Accepted) def reject(self): self.done(QtGui.QDialog.Rejected) def showEvent(self, event): print "ColorDialog> showEvent self.canFocusOut=", self.canFocusOut self.canFocusOut = True def closeEvent(self, event): if not self.canFocusOut: event.ignore()
Я не понимаю, почему, если выдвинуть доквиджет из главного окна, то всё работает правильно.