self.a = QtGui.QRadioButton()
self.b = QtGui.QRadioButton()
当我有一个数组:arr = [“a”,“b”,“c”.....“x”,“z”]
如何更高效地创建它而不是26次?
答案 0 :(得分:1)
不要将每个单选按钮分配给类中自己的实例变量,而是使用字典:
import string
from QtGui import QRadioButton
class RadioButtons(object):
def __init__(self, keys=string.ascii_lowercase):
self.buttons = {c: QRadioButton() for c in keys}
这将创建一个名为self.buttons
的字典(使用字典理解)作为RadioButtons类对象中的实例变量。您可以使用字典查找来访问各个按钮:
rb.buttons['z']
>>> rb = RadioButtons()
>>> rb.buttons['a']
<__main__.QRadioButton object at 0x7f576c3666d0>
>>> rb.buttons['z']
<__main__.QRadioButton object at 0x7f576c36a550>
字典是可行的方法,但如果你真的必须将每个按钮作为实例变量,那么你可以这样做:
class RadioButtons(object):
def __init__(self, keys=string.ascii_lowercase):
self.__dict__.update({c: QRadioButton() for c in keys})
>>> rb = RadioButtons()
>>> rb.a
<__main__.QRadioButton object at 0x7f576c3666d0>
>>> rb.z
<__main__.QRadioButton object at 0x7f576c36a550>
答案 1 :(得分:1)
通常,您不需要保留对按钮的本地引用。在这种情况下,只要他们有一个负责销毁它们的父窗口小部件,你就可以安全地忘记它们。
使用QButtonGroup
及其全局信号buttonClicked
也将有助于以通用方式管理一组按钮。但您也可以使用partial
将每个按钮连接到一个插槽,以传输用户定义的数据,以帮助您识别生成回调的按钮。
import sys
import string
from PyQt5 import QtWidgets, QtCore
class Window(QtWidgets.QDialog):
def __init__(self):
super().__init__()
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.letters = list(string.ascii_lowercase)
self.lay = QtWidgets.QVBoxLayout(self)
self.group = QtWidgets.QButtonGroup()
# Create all the buttons
for letter in self.letters:
btn = QtWidgets.QRadioButton(letter, self)
# In case you want to find it back later using findChild
btn.setObjectName("btn_"+letter)
self.group.addButton(btn)
self.lay.addWidget(btn)
self.group.buttonClicked.connect(self.btnCliked)
def btnCliked(self, btn):
# Do something with the button
print(btn.text())
def main():
qApp = QtWidgets.QApplication(sys.argv)
win = Window()
win.show()
sys.exit(qApp.exec_())
if __name__ == '__main__':
main()
partial
示例:
from functools import partial
[...]
for letter in self.letters:
btn = QtWidgets.QRadioButton(letter, self)
self.lay.addWidget(btn)
btn.clicked.connect(partial(self.btnClicked, letter))
[...]
def btnCliked(self, letter):
print(letter)