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

Posted

技术标签:

【中文标题】按下时将按钮分组以执行相同的操作【英文标题】:Group buttons to do the same thing when pressed 【发布时间】:2021-03-09 04:44:21 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

嗯,差不多:当向同一个父级添加单选按钮时(无论是 QGroupBox、QFrame、普通 QWidget 等),它们会自动排他,因为它们的 autoExclusive 属性已为 QRadioButton 启用,但是这不是你的情况:即使你正在为这些按钮设置属性,你似乎也需要一个状态,no button 也可以检查,并且排他性不允许这样做。

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

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)
    # ...

一些注意事项:

在逻辑上对按钮进行分组,您可以使用QButtonGroup 类。

如果您要添加许多对象和绘图,我建议您为每个组使用一个子类,并且每次都添加一个新实例;这将使您的代码更清晰,更有条理。

样式表支持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;
    
''')

【讨论】:

很棒的信息,谢谢!我会努力实施你的建议。关于第二部分的一个问题:我在我的窗口(QDialog)中将背景颜色设置为白色,这似乎覆盖了您在app.setStylesheet 中建议的颜色设置。我该如何避免呢? 这取决于你如何设置颜色。 没关系,摆脱它。我决定根据您的示例为按钮及其创建创建一个单独的类。我还添加了一个用于按下 NOK 的切换检查,感谢提示,一开始甚至没有想到它。

以上是关于按下时将按钮分组以执行相同的操作的主要内容,如果未能解决你的问题,请参考以下文章

按下时将图像添加到按钮

按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇

按下时更改按钮文本颜色

如何使 segue 等待功能在按钮按下时完成?

当 UIAlertController 在按钮按下时被关闭时收到通知

按下时更改操作栏按钮的背景颜色