Автоматически создавать страницы QStackedWidget на основе Tuple

Я новичок в python, и я чувствую, что это сложный вопрос, учитывая, что он может выходить за рамки Stack Exchange. Пожалуйста, потерпите меня.

У меня есть QTreeWidget и QStackedWidget. Я заполнил QTreeWidget с помощью кортежа

TreeList = ({

    'Header1': ((
        'Item11',
        'Item12',
    )),

    'Header2': ((
        'Item21',
        'Item22'
    ))
})

for key, value in TreeList.items():
    root = QTreeWidgetItem(self.QTreeWidget, [key])
    for val in value:
        root.addChild(QTreeWidgetItem([val]))

Я хотел бы использовать этот же кортеж для заполнения QStackedWidget страницами, которые соответствуют QTreeWidget, и устанавливать сигналы и слоты в одном и том же цикле. Я пробовал использовать:

for key in TreeList['Item1']:
    page = QWidget()
    page.setObjectName(key)
    self.QStackedWidget.addWidget(page)
    print(self.QStackedWidget)

но все объекты указывают на одно и то же шестнадцатеричное значение, что, как я полагаю, означает, что они не уникальны. Возможно, мне нужно увеличить индекс? В любом случае я не смог понять, как генерировать сигналы и слоты при этом, поскольку они создаются динамически, и мне нужны уникальные, но предсказуемые имена.

Идея состоит в том, что просто добавляя новую категорию или элемент в кортеж, QTreeView, QStackedWidget и сигналы/слоты генерируются во время выполнения без необходимости модификации какого-либо исходного кода за пределами кортежа.

Каков наилучший способ добиться этого?

Извините, если это слишком много, но я подумал, что это может быть хорошим вопросом на случай, если кто-то еще попытается сделать то же самое позже.

РЕДАКТИРОВАТЬ: я использую Python 3.6 и PyQt5


person artomason    schedule 01.12.2017    source источник
comment
Какая связь должна быть между страницей QStackedWidget и элементом QTreeWidget, то есть какие сигналы вы хотите соединить?   -  person eyllanesc    schedule 01.12.2017
comment
Я хотел бы использовать QTreeWidget для навигации по страницам. Заголовок не будет иметь никакой связи.   -  person artomason    schedule 01.12.2017


Ответы (1)


Идея состоит в том, чтобы связать индекс QStackedWidget с QTreeWidgetItem, чтобы мы могли использовать метод setData() QTreeWidgetItem для сохранения индекса, а затем восстановить его с помощью метода data():

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.tree = QTreeWidget(self)
        self.stack = QStackedWidget(self)
        lay = QHBoxLayout(self)
        lay.addWidget(self.tree)
        lay.addWidget(self.stack)

        for key, value in TreeList.items():
            root = QTreeWidgetItem(self.tree, [key])
            for val in value:
                item = QTreeWidgetItem([val])
                root.addChild(item)
                widget = QLabel(val,  self)
                ix = self.stack.addWidget(widget)
                item.setData(0, Qt.UserRole, ix)
        self.tree.expandAll()
        self.tree.itemClicked.connect(self.onItemClicked)

    def onItemClicked(self, item, column):
        val = item.data(0, Qt.UserRole)
        if val is not None:
            self.stack.setCurrentIndex(val)

TreeList = ({

    'Header1': ((
        'Item11',
        'Item12',
    )),

    'Header2': ((
        'Item21',
        'Item22'
    ))
})

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 01.12.2017
comment
У меня не было возможности протестировать, я сделаю это, как только вернусь домой. В случае, если мне нужно сослаться на одну из страниц из другой области источника, как лучше всего это сделать? Например, self.stack ссылается на QStackedWidget, но в этом примере мне нужен item11, и я не обязательно знаю, какой у него индекс. Извините, если это элементарный вопрос. У меня не было времени поработать с вашим ответом. Говоря о том, что здесь можно связаться с вами напрямую? - person artomason; 01.12.2017
comment
Наконец-то появилась возможность протестировать это. Как и ожидалось, он работает безупречно, но, учитывая мою уникальную ситуацию, мне нужно переосмыслить, как я подхожу к этому. - person artomason; 02.12.2017