我有对话:
它包含许多平面QPushButtons,QTextEdit和另一个QPushButton。点击“获取列表”后,我们可以在QTextEdit中看到已选中按钮的列表。
我的问题是如何以一种聪明的方式获得此功能。现在我正在检查每个按钮:
if self.ui.bq6o.isChecked():
cards.append("Q6o")
if self.ui.bk2o.isChecked():
cards.append("K2o")
if self.ui.bq3o.isChecked():
cards.append("Q3o")
if self.ui.bt7s.isChecked():
cards.append("T7s")
if self.ui.bq4o.isChecked():
cards.append("Q4o")
if self.ui.bt4s.isChecked():
cards.append("T4s")
if self.ui.b98o.isChecked():
cards.append("98o")
if self.ui.bjto.isChecked():
cards.append("JTo")
if self.ui.btt.isChecked():
cards.append("TT")
if self.ui.bq7o.isChecked():
cards.append("Q7o")
[...]
显然我不喜欢那样的代码。我一直在寻找一些小部件“按钮矩阵”,但没有运气。我将很感激你的建议。
答案 0 :(得分:2)
所有按钮都应该是同一个小部件的子节点,可能是对话框本身。只需获取该窗口小部件的句柄即可获取所有子按钮,然后遍历它们,如果选中它们,则包含其文本。
parent = dialog # or whatever
cards = [widget.text() for widget in parent.children() if isinstance(widget, QPushButton) and widget.isChecked()]
您可能需要在if语句中包含一些代码以排除“获取列表”按钮,或者对话框中可以设置为“已选中”但不应包含在卡列表中的任何其他按钮。
答案 1 :(得分:1)
正如@Brendan在另一个问题中建议的那样,你可以在单个列表理解中循环它们。但另一种方法是将每个按钮切换信号连接到一个插槽,允许它们在检查时进行注册。
# somewhere in your class
self.checkedList = set()
def buttonChecked(self, checked):
button = self.sender()
if checked:
self.checkedList.add(button)
else:
if button in self.checkedList:
self.checkedList.remove(button)
# when you create a new button
button.toggled.connect(self.buttonChecked)
这将让您始终拥有一组仅自动报告的选中按钮。否则,您必须在其父级和循环下跟踪它们以找出每次检查的内容。
这是另一个结合@Brendans循环和我的信号建议的版本。这可能有助于你的按钮在你的UI上分散得更多,而不是全部在单个父母之下......但首先假设它们都在父母之下......
parent = dialog
for widget in parent.children():
if isinstance(widget, QPushButton):
widget.toggled.connect(self.buttonChecked)
您可以在__init__()
中对按钮的所有位置重复此操作,并将它们全部注册到插槽中。