【问题标题】: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 的新手,所以这个问题的答案可能很简单,我似乎没有找到。

【问题讨论】:

    标签: python python-2.7 pyqt qpushbutton


    【解决方案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 的切换检查,感谢提示,一开始甚至没有想到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2011-01-25
    • 2014-12-04
    相关资源
    最近更新 更多