Форум сайта python.su
reclosedev
Похоже вот на это http://python.su/forum/post/88673/
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()
Офлайн
KriOзакинь сюда минимальный тест
но в тесте диалоги не схлопываются, всё нормально работает
Офлайн
Вот тест в аттаче. Я по возможности сохранила структуру наследования классов. В тесте ColorDialog не схлопывается. В реальном процессе схлопывается сразу после засветки в винде, если QDockWidget не выдвигать из главного окна. Может возникнуть вопрос: “Ззачем такая структура классов?” Проект большой и сложный. На базе этих классов ещё работают другие классы и другое приложение.
Прикреплённый файлы: dialog_test.py (15,0 KБ)
Офлайн
нашёл пару ошибок
1)
похоже, ошибка перекочевала из реального проекта
[guest@localhost 23c8]$ python dialog_test.py
Traceback (most recent call last):
File "dialog_test.py", line 146, in createEditor
self.editor = editor
UnboundLocalError: local variable 'editor' referenced before assignment
[guest@localhost 23c8]$
KriOнадо учесть, что диалог появляется - то есть запуск настроен
В OS Windows 7 диалог появляется и тут же схлопывается
Отредактировано py.user.next (Апрель 30, 2014 20:25:50)
Офлайн
py.user.nextнее, это я не аккуратно тест сделала. В реальном проекте проверяются ещё другие колонки и editor создается для них, т.е. не бывает ситуации, когда он не создаётся до этого присваивания.
нашёл пару ошибок1)похоже, ошибка перекочевала из реального проекта
py.user.nextСпасибо.
2)
кодировка там неправильно выставлена
кодировка вверху относится к кодировке самого исходника, она сообщает интерпретатору, как раскодировать данные после объявления кодировки (типа как на html-странице делают для браузера)
внёс изменения
https://gist.github.com/23c8e5d16fc82489d931/revisions
py.user.next
имеешь в виду модальный диалог выбора цвета ?
попробуй модальность убрать
Офлайн
посмотри новый коммит, я там добавил отладку
от запуска до после изменения цвета пишет
cd init
cd init
cd create editor
cd set editor data
cd set model data
cd emit color data
Отредактировано py.user.next (Май 6, 2014 00:33:21)
Офлайн
py.user.next
посмотри новый коммит, я там добавил отладкуот запуска до после изменения цвета пишет
py.user.next
проверь на винде
Офлайн
Нашла. У виджета, который в центральном виджете главного окна, устанавливается сигнал update(), по которому вызывается слот update_attr_tree(), в котором модель для дерева создаётся заново. В делегате дерева отредактированное значение я не засылаю напрямую в дерево, а формирую некий скрипт и вызываю глобальную функцию выполнения этого скрипта и затем вызываю функцию перерисовки картинки, а она уже формирует сигнал update(), по которому дерево обновляется. Почему-то в винде этот сигнал срабатывал раньше, чем в делегате успевали что-то отредактировать. Я поставила блокировку сигнала пока не выйдут из делегата.
Прошу прощения, что вам пришлось потратить своё время на мои заморочки. Спасибо за готовность помочь.
Офлайн