Qt Python - 在按钮列表中更改所有按钮的颜色,直到被单击的按钮

Qt Python - in a list of buttons change color of all buttons up until the one that was clicked

我有一个像这样的 Qt 按钮列表:self.buttons = [button1, button2, button3] 单击一个按钮时,我希望列表中被单击按钮之前的所有按钮都更改其颜色。

我制作了一个 for 循环来遍历按钮并将每个按钮连接到我定义的函数,但是当我单击按钮并且连接的函数运行时,它不知道按钮中按钮的顺序列表,因此我不能让其他按钮改变颜色。我在想我需要以某种方式将按钮的 ID 或其他东西传递给函数,但无法弄清楚该怎么做,因为我无法将参数传递给连接的函数:self.button1.clicked.connect(self.change_color)

一个参数由 Qt 本身自动传递给连接的函数,但它是主要的 window,对我的情况没有帮助:

def change_color(i):  
    print(i)

点击时输出:

<__main__.Main_Window(0x6000019e0000, name="MainWindow") at 0x11df5ccc0>

将所有按钮添加到 QButtonGroup (using their index as id) and then connect to the group's idClicked signal。这将自动发送点击按钮的索引。下面是一个简单的演示,展示了如何做到这一点:

import sys, random
from PySide2 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        self.buttons = QtWidgets.QButtonGroup(self)
        for index in range(1, 11):
            button = QtWidgets.QPushButton(f'Button {index}')
            self.buttons.addButton(button, index)
            layout.addWidget(button)
        self.buttons.idClicked.connect(self.handleButtons)

    def handleButtons(self, index):
        color = f'#{random.randint(0, 0xFFFFFF):06x}'
        for index in range(1, index):
            self.buttons.button(index).setStyleSheet(f'background: {color}')

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setWindowTitle('Test')
    window.show()
    sys.exit(app.exec_())