在 QT Designer 中连接按钮阵列

Connect arrays of buttons in QT Designer

所以我在 QT Designer GUI 应用程序上有大量按钮都命名为 LED_i,其中 i 的范围是 0-191,即:LED_0、LED_1、... , LED_191.除了更改输入 i 之外,我希望单击时发生基本相同的事情。所以 LED_0 单击时会调用函数 OnClick(0),LED_75 会调用 OnClick(75) 等等。

我正在将我的按钮连接到

ui.LED_0.clicked.connect(OnClick0)

通常为每个按钮使用单独的功能。然而,这将需要 191 个功能,以及 191 行像上面那样将我的按钮连接到它们的功能。我确定我可以编辑它 s.t。我可以通过传递被单击的按钮名称并从中获取数字来使用相同的功能,但这仍然需要 button.clicked.connect 的 191 行。有什么方法可以更有效地做到这一点?

TIA

PyQt5 并非不可能。这非常适合 QButtonGroup。有几种方法可以解决它。

使用设计器的 QButtonGroup

要在设计器中设置 QButtonGroup,请执行以下操作:

  • select 两个或更多按钮、单选框或复选框
  • 右键单击其中一个按钮,您将获得一个上下文菜单项,Assign to button group --> New button group

在此之后,您会看到 buttonGroup(默认名称)出现在对象检查器中。

要运行 当你的一个按钮被点击时的代码,你可以使用 QButtonGroup 的 buttonClicked 信号。它会给你一个被点击的按钮的引用,你可以从 objectName 中找出要做什么。

ui.buttonGroup.buttonClicked.connect(self.OnClicked)

然后

def OnClicked(self, button):
     # button objectName follows pattern LED_<number>
     button_number = int(button.objectName()[4:])
     ... do stuff here with button_number

代码中的 QButtonGroup

原来post,设计器中有191个按钮。需要安排很多按钮。如果出于某种原因,你想用代码代替,你可以为每个按钮分配一个 id,因为它被添加到组中,然后你可以使用 idClicked 信号:

grid = QGridLayout()
buttonGroup = QButtonGroup()
buttonGroup.idClicked.connect(OnClick)
buttonList = []
for row in range(14):
    rowList = []
    for col in range(14):
        button_number = 14*row + col
        button = QPushButton(f'{button_number}', objectName=f'LED_{button_number}')
        rowList.append(button)
        buttonGroup.addButton(button, button_number)
        grid.addWidget(button, row, col)

然后

def OnClick(self, idClicked):
    ... do something with idClicked here