Как сделать данные постоянными при использовании метода setData - PullRequest
0 голосов
/ 26 сентября 2018

Приведенный ниже код создает один QComboBox.Комбинации QStandardItem s устанавливаются с помощью data_obj с использованием метода setData.Изменение текущего индекса combo вызывает метод run, который повторяет combo 'и печатает data_obj, который превращается в словарь Python.Как сделать data_obj постоянным?

enter image description here

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

1 Ответ

0 голосов
/ 26 сентября 2018

Ниже приведено рабочее решение этой проблемы:

enter image description here

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