LINUX.ORG.RU

Вызов диалога в виджете, созданном делегатом

 


0

1

Привет, суть такова.
Делаю простой property grid (treeview + модель + делегат). Есть несколько пропертей при взаимодействии с которыми нужно вызывать сторонние диалоги. Например, указание пути к файлу или выбор цвета. Но при вызове этого диалога, я так понимаю, происходит потеря фокуса у виджета созданного через QItemDelegate::createEditor и в модель записывается старое значение.

То есть, код такой:

def createEditor(self, parent, option):
    editor = QtGui.QPushButton(parent)
    editor.clicked.connect(self.onButtonClicked)
    return editor

def setEditorData(self, editor, value):
    editor.setText(value)
    self.selectedFile = value

def editorData(self, editor):
    return self.selectedFile

def onButtonClicked(self):
    dialog = QtGui.QFileDialog()
    if dialog.exec_() == QtGui.QDialog.Rejected:
        return 
    self.selectedFile = dialog.selectedFiles()[0]

Подскажите куда копать и как делать правильно.

Есть предложение сделать это не через делегат, а через отдельный специальный диалог.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Ага, только не обязательно выбор файлов, а просто вызов какого-то диалога, кастомного в том числе.

oh-la-la
() автор топика
Ответ на: комментарий от UVV

Я еще полазил по инету и нашел такое решение: https://stackoverflow.com/questions/2468587/c-object-destroyed-in-qcombobox-d...

Там у делегата переопределяется метод eventFilter и для нужных виджетов, которые вызывают диалоги вводится флаг canFocusOut:

def eventFilter(self, editor, event):
    if event.type() == QtCore.QEvent.FocusOut and hasattr(editor, 'canFocusOut'):
        if not editor.canFocusOut:
            return False
    return QtGui.QItemDelegate.eventFilter(self, editor, event)
Для моего простого property grid'a сойдет, ибо сейчас не хочется заниматься отрисовкой виджетов. Но я погляжу другой способ, когда будет время.

Спасибо.

oh-la-la
() автор топика
Ответ на: комментарий от oh-la-la

Можно попробовать.. а кто потом удалит твой виджет? Не окажется ли он в подвешенном состоянии?

UVV ★★★★★
()
Ответ на: комментарий от UVV

Не, виджеты удаляются после QItemDelegate::setModelData. Я на всякий случай проверил сейчас вот, подключившись к сигнлау destroyed. Тут просто события потери фокуса не обрабатываются делегатом.

oh-la-la
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.