Я пытаюсь использовать QDataWidgetMapper
для управления пользовательским QComboBox
с использованием Enum
.
I Нахожусь на Windows 10, используя Python 2.7.13, PySide 1.2.4 (Qt 4.8.7), вот код:
from PySide.QtCore import Qt, Property
from PySide.QtGui import (
QApplication,
QComboBox,
QDataWidgetMapper,
QFormLayout,
QLineEdit,
QMainWindow,
QPushButton,
QStandardItem,
QStandardItemModel,
QWidget,
)
from enum import Enum
class State(Enum):
foo = 1
bar = 2
baz = 3
class StateEdit(QComboBox):
def __init__(self, parent=None):
super(StateEdit, self).__init__(parent)
self.addItems(State._member_names_)
def state(self):
text = self.currentText()
return State[text] if text else None
def setState(self, value):
if value is None:
index = -1
else:
index = self.findText(value.name, Qt.MatchExactly)
self.setCurrentIndex(index)
state = Property(State, state, setState, user=True)
class Window(QMainWindow):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self._name_edit = QLineEdit()
self._state_edit = StateEdit()
self._state_button = QPushButton('Change State')
self._content = QWidget()
self.setCentralWidget(self._content)
self._form = QFormLayout()
self._content.setLayout(self._form)
self._form.addRow('Name', self._name_edit)
self._form.addRow('State', self._state_edit)
self._form.addRow('Action', self._state_button)
self._state_button.released.connect(self._on_state_button_clicked)
self._model = QStandardItemModel()
name_item = QStandardItem()
state_item = QStandardItem()
name_item.setText('My Name')
state_item.setData(State.bar)
self._model.appendRow([name_item, state_item])
self._mapper = QDataWidgetMapper()
self._mapper.setModel(self._model)
self._mapper.addMapping(self._name_edit, 0)
self._mapper.addMapping(self._state_edit, 1, 'state')
self._mapper.toFirst()
def _on_state_button_clicked(self):
self._state_edit.state = State.baz
def data(self):
return {
'name': self._name_edit.text(),
'state': self._state_edit.state,
}
if __name__ == "__main__":
import sys
from pprint import pprint
app = QApplication(sys.argv)
win = Window()
win.show()
app.exec_()
pprint(win.data())
Проблема в том, что виджет enum всегда всплывает показывая свой первый индекс.
Кажется, нет никаких проблем с самим свойством, так как установка его с помощью кнопки работает.
Состояние также обновляется при выборе другого индекса с помощью поля со списком, о чем свидетельствуют данные, напечатанные при закрытии окна.
Я просмотрел свойства и динамические свойства c пользовательский флаг в свойствах, даже переопределяющий setProperty
и property
в виджете, безрезультатно.
Я также изучил это руководство , но, похоже, это обычные проблемы с QComboBox
и QDataWidgetMapper
на самом деле не применимы к моему случаю.
Единственное решение, которое я вижу, это использовать обычный рабочий процесс с QComboBox
и просто использовать простые старые индексы вместо значений enum, но это было бы позором, мне просто нужно, чтобы начальное отображение было правильно запущено, и все работало бы отлично.
Я действительно не знаю, где искать, может быть, это проблема PySide Speci c, поэтому любые указатели помогут!