【发布时间】:2018-09-26 04:53:21
【问题描述】:
下面的代码创建了一个QComboBox。组合的QStandardItems 使用setData 方法设置为data_obj。更改combo 的当前索引会触发run 方法,该方法迭代combo' 并打印data_obj,该data_obj 将转换为Python 字典。如何使data_obj 持久化?
app = QApplication(list())
class DataObj(dict):
def __init__(self, **kwargs):
super(DataObj, self).__init__(**kwargs)
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
self.combo = QComboBox(self)
for i in range(5):
combo_item = QStandardItem('item_%s' % i)
data_obj = DataObj(foo=i)
print '..out: %s' % type(data_obj)
combo_item.setData(data_obj, Qt.UserRole + 1)
self.combo.model().appendRow(combo_item)
self.combo.currentIndexChanged.connect(self.run)
self.layout().addWidget(self.combo)
def run(self):
for i in range(self.combo.count()):
item = self.combo.model().item(i, 0)
data_obj = item.data(Qt.UserRole + 1)
print ' ...in: %s' % type(data_obj)
if __name__ == '__main__':
gui = Dialog()
gui.resize(400, 100)
gui.show()
qApp.exec_()
【问题讨论】:
-
这种行为只发生在PySide中,在PyQt4中它返回一个QVariant,你可以使用
toPyObject()得到<class '__main__.DataObj'>,在PyQt5和PySide2中返回<class '__main__.DataObj'> -
感谢您的评论!我在 OS X 10.13.6 上使用 PySide2 和 QtCore.qVersion
5.6.1 -
我已经用 pyside2 5.11.2 试过了
-
问题中
persistent的用法不正确。不涉及持久性,谈到持久性会使问题变得不清楚。 -
我希望类型
main.DataObj'> 在运行时持久化。
标签: python pyside qcombobox qstandarditem