我正在尝试使用 aQDataWidgetMapper
来驱动自定义QComboBox
使用Enum
.
我在 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())
问题是,枚举小部件总是弹出显示它的第一个索引。
属性本身似乎没有问题,因为使用按钮设置它是有效的。
当使用组合框选择不同的索引时,状态也会更新,如窗口关闭时打印的数据所示。
我查看了属性和动态属性,属性上的用户标志,甚至覆盖setProperty
和property
小部件,但无济于事。
我也查看了本指南,但它似乎经常出现问题QComboBox
并且QDataWidgetMapper
并不真正适用于我的情况。
我看到的唯一解决方案是使用常规工作流程,QComboBox
只使用普通的旧索引而不是枚举值,但这太可惜了,我只需要正确触发初始映射,一切都会完美运行。
我真的不知道在哪里看,也许这是一个 PySide 特定的问题,所以任何指针都会有所帮助!