将按钮分组以在按下时执行相同的操作

Group buttons to do the same thing when pressed

我有几幅图希望用户使用 OK/NOK 进行评估。如何将所有 OK 和 NOK 分组,以便在按下任何 OK 时,按钮变为绿色(或在按下 NOK 时变为红色)。目前我只有一个按钮。

 x_mean_ok = QPushButton("OK")
 x_mean_ok.setCheckable(True)
 x_mean_ok.setStyleSheet(":checked{ background-color: #6cdb53;}")

此外,当用户在同一个图中单击“确定”然后单击“否”时,“确定”按钮应该再次“取消”选中,因此需要另一个分组。我假设我需要 QGroupBox 用于后者,但不太确定如何将它们放在一起。这是获得更好想法的视觉效果: 按钮:

我是 pyqt 的新手,所以这个问题的答案可能很简单,但我似乎没有找到它。

QGroupBox只是一个视觉容器,与按钮之间的关系无关

好吧,几乎:当向同一个父级添加单选按钮时(无论它是 QGroupBox、QFrame、普通 QWidget 等),它们会自动排他,因为它们 autoExclusive 属性 已为 QRadioButton 启用,但您的情况并非如此:即使您为这些按钮设置了 属性,您似乎也需要一个 没有按钮 的状态被检查,排他性不允许这样做。

最简单的解决方案是创建一个函数,returns 小部件按父级分组,并设置所有参数和基本功能:

def createButtons(self):
    def check_ok(state):
        if state:
            x_mean_ok.setChecked(False)
    x_mean_ok = QPushButton("OK")
    x_mean_ok.setCheckable(True)
    x_mean_ok.setStyleSheet(":checked{ background-color: #6cdb53;}")
    x_mean_nok = QPushButton("NOK")
    x_mean_nok.setCheckable(True)
    x_mean_nok.setStyleSheet(":checked{ background-color: red;}")
    x_mean_nok.toggled.connect(check_ok)

    layout = QtWidgets.QVBoxLayout()
    layout.addWidget(x_mean_ok)
    layout.addWidget(x_mean_nok)
    return layout, x_mean_ok, x_mean_nok

# ...
def somefunction(self):
    # create the plot...
    button_layout, x_mean_ok, x_mean_nok = self.createButtons()
    layout.addLayout(button_layout)
    # ...

一些注意事项:

  • 逻辑分组按钮,可以使用QButtonGroupclass.

  • 如果你要添加很多对象和地块,我建议你为每个组使用一个subclass,并且每次都添加一个新实例;这将使您的代码更清晰、更有条理。

  • 样式表支持 property selector 来区分小部件。您可以为这些按钮设置 属性 并为父级(甚至整个 QApplication)设置单个样式表:

        def createButtons(self):
            x_mean_ok.setProperty("OK", True)
            x_mean_nok.setProperty("NOK", True)
            # ...
    
    app = QApplication(sys.argv)
    app.setStyleSheet('''
        QPushButton[OK="true"]:checked {
            background-color: #6cdb53;
        }
        QPushButton[NOK="true"]:checked {
           background-color: red;
        }
    ''')