【问题标题】:How to make data persistent when setData method is used使用 setData 方法时如何使数据持久化
【发布时间】: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


【解决方案1】:

以下是该问题的有效解决方案:

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_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2020-04-13
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多