Как добраться до контента во втором столбце QTreeWidget QComboBox? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть AppDialog(QtGui.QWidget), содержащий QtreeWidget.

self.tree = QtGui.QTreeWidget()

Я заполняю данные из self.sequences в этот QtreeWidget с помощью функции seqTree.

Данные из self.sequences:

{'090': 
  {'090-0010': [
    {'code': '090-0010_v000', 'type': 'Version', 'id': 26676, 'entity.Shot.sg_sequence.Sequence.code': '090', 'entity.Shot.code': '090-0010'}, 
    {'code': '090-0010_maquette_v001', 'type': 'Version', 'id': 27848, 'entity.Shot.sg_sequence.Sequence.code': '090', 'entity.Shot.code': '090-0010'}, 
    {'code': '090-0010_maquette_v002', 'type': 'Version', 'id': 27849, 'entity.Shot.sg_sequence.Sequence.code': '090', 'entity.Shot.code': '090-0010'}]}, 
'082': 
  {'082-0020': [
    {'code': '082-0020_compo_v000', 'type': 'Version', 'id': 28748, 'entity.Shot.sg_sequence.Sequence.code': '082', 'entity.Shot.code': '082-0020'}}

Функция seqTree:

def seqTree(self):  
    for seq in sorted(self.sequences):
        if self.sequences[seq]:
            parent = QtGui.QTreeWidgetItem(self.tree)
            parent.setFlags(parent.flags() | QtCore.Qt.ItemIsTristate | QtCore.Qt.ItemIsUserCheckable)
            parent.setCheckState(0, QtCore.Qt.Unchecked)
            parent.setText(0,unicode(seq))
            for shot in self.sequences[seq]:
                child = QtGui.QTreeWidgetItem(parent)
                child.setFlags(child.flags() | QtCore.Qt.ItemIsUserCheckable)
                child.setCheckState(0, QtCore.Qt.Unchecked)
                child.setText(0,unicode(shot))
                versionCombo = QtGui.QComboBox(self.tree)
                versionCombo.setFixedWidth(200)
                for version in sorted(self.sequences[seq][shot], reverse=True):
                    versionCombo.addItem(version['code'])
                self.tree.setItemWidget(child, 1, versionCombo)

Это решение работает для заполнения данных.Мой QTreeWidget имеет структуру по первым ключам, а затем как дочерние, вторым ключам в первом столбце.Во втором столбце я добавляю QComboBox с содержимым из кода, например, «090-0010_maquette_v001».

Но тогда я не могу получить содержимое ComboBox.Чтобы извлечь выбор, я использую следующую функцию:

def checkedList(self):
    checked = dict()
    self.selection = []
    root = self.tree.invisibleRootItem()
    signal_count = root.childCount()

    for i in range(signal_count):
        signal = root.child(i)
        checked_sweeps = list()
        num_children = signal.childCount()

        for n in range(num_children):
            child = signal.child(n)
            if child.checkState(0) == QtCore.Qt.Checked:
                checked_sweeps.append(child.text(0))
                #### I need here to retrieve the content of ComboBox.

        checked[signal.text(0)] = checked_sweeps

    for item in sorted(checked):
        if not checked[item] == []:
            for shot in checked[item]: 
                self.selection.append(shot)

Я действительно не могу найти, как добраться до второго столбца child.Я пробовал несколько вещей, таких как child.data(), indexFromItem().Нужно ли связывать ComboBox с классом, чтобы найти его?или достаточно ссылки на QtreeWidget?

1 Ответ

0 голосов
/ 12 ноября 2018

Вы должны получить QComboBox с itemWidget:

if child.checkState(0) == QtCore.Qt.Checked:
    checked_sweeps.append(child.text(0))
    combo = self.tree.itemWidget(child, 1)
    print(combo.currentText())
...