TransWikia.com

Не переключаются виджеты в QStackedWidget

Stack Overflow на русском Asked by IceCube092 on December 30, 2021

    self.button = QtWidgets.QPushButton(self)
    self.button.setGeometry(10, 50, 280, 30)
    self.button.setText(self.names["odds"]["button"])

    self.menu = QtWidgets.QMenu(self.button)
    self.button.setMenu(self.menu)

    self.menu.clear()
    self.stack = QtWidgets.QStackedWidget(self)
    self.stack.setGeometry(10, 100, 280, 290)

    labels_names = self.names["odds"]["labels"]
    buttons = []

    for value in values:
        scroll = QtWidgets.QScrollArea()
        self.stack.addWidget(scroll)
        widget = QtWidgets.QWidget()
        widget.setGeometry(0, 0, 240, 150)

        scroll.setWidget(widget)

        action = QtWidgets.QWidgetAction(self.button)

        button = QtWidgets.QPushButton()
        button.setText(str(value.pop("bookmaker")))
        button.clicked.connect(
            lambda: self.stack.setCurrentIndex(values.index(value)))

        action.setDefaultWidget(button)
        self.menu.addAction(action)
        buttons.append(button)

        index = 0
        for name in labels_names:
            val = value.get(name)
            if val is not None:
                label = QtWidgets.QLabel(widget)
                label.setGeometry(10, 10 + 25 * index, 90, 25)
                label.setText(str(name))
                label.setAlignment(QtCore.Qt.AlignLeft)
                label.setFont(self.font)

                label_val = QtWidgets.QLabel(widget)
                label_val.setGeometry(110, 10 + 25 * index, 120, 25)
                label_val.setText(str(val))
                label_val.setAlignment(QtCore.Qt.AlignRight)
                label_val.setFont(self.font)

                widget.setFixedHeight(50 + 25 * index)
                index += 1

При таком коде при нажатии на все кнопки в выпадающем меню включается один и тот же виджет, причем последний. Не понимаю в чем дело, поскольку в лямбду передаются разные индексы. Если явно указывать числа (1,2,3) то все нормально и переключение работает, а при итерации по индексам – нет.

2 Answers

v = values.index(value)
button.clicked.connect(partial(self.stack.setCurrentIndex, v))

Вот так почему-то сработало

Answered by IceCube092 on December 30, 2021

Попробуйте так:

button.clicked.connect(
    lambda _, value=value: self.stack.setCurrentIndex(values.index(value))
)

Я бы еще немного упростил код. Можно ведь сразу вести индекс значений values, чтобы не запрашивать их через метод index:

...
for i, value in enumerate(values):
    ...
    button.clicked.connect(
        lambda _, i=i: self.stack.setCurrentIndex(i)
    )
    # Или:
    button.clicked.connect(partial(self.stack.setCurrentIndex, i))

Answered by gil9red on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP