按下时将按钮分组以执行相同的操作
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, 蟒蛇