将按钮分组以在按下时执行相同的操作
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;
}
''')
我有几幅图希望用户使用 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; } ''')