使用 setData 方法时如何使数据持久化
How to make data persistent when setData method is used
下面的代码创建了一个 QComboBox
。该组合的 QStandardItem
是通过 data_obj
使用 setData
方法设置的。更改 combo
's current index triggers run
method which iterates combo
' 并打印 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_()
下面是这个问题的有效解决方案:
app = QApplication(list())
class DataObj(dict):
def __init__(self, **kwargs):
super(DataObj, self).__init__(**kwargs)
class Object(object):
def __init__(self, data_obj):
super(Object, self).__init__()
self.data_obj = data_obj
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)
obj = Object(data_obj=DataObj(foo=i))
print '..out: %s' % type(obj.data_obj)
combo_item.setData(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)
obj = item.data(Qt.UserRole + 1)
print ' ...in: %s' % type(obj.data_obj)
if __name__ == '__main__':
gui = Dialog()
gui.resize(400, 100)
gui.show()
qApp.exec_()
下面的代码创建了一个 QComboBox
。该组合的 QStandardItem
是通过 data_obj
使用 setData
方法设置的。更改 combo
's current index triggers run
method which iterates combo
' 并打印 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_()
下面是这个问题的有效解决方案:
app = QApplication(list())
class DataObj(dict):
def __init__(self, **kwargs):
super(DataObj, self).__init__(**kwargs)
class Object(object):
def __init__(self, data_obj):
super(Object, self).__init__()
self.data_obj = data_obj
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)
obj = Object(data_obj=DataObj(foo=i))
print '..out: %s' % type(obj.data_obj)
combo_item.setData(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)
obj = item.data(Qt.UserRole + 1)
print ' ...in: %s' % type(obj.data_obj)
if __name__ == '__main__':
gui = Dialog()
gui.resize(400, 100)
gui.show()
qApp.exec_()