我正在创建一个包含许多checkBox的应用程序。每4个复选框都在groupBox_n
(n = 36)内,然后这些groupBox在另一个groupBox内。
每个checkBox都按照一定的规则命名,这对我来说非常方便。我希望能够访问每个人,但我不想每次都输入他们的名字。所以我想在列表中复制他们的名字,以便我可以遍历列表并控制,具体取决于他们的名字。
但是当我尝试连接一个从我的列表中调用字符串的按钮时,我无法做到这一点。这里我用QLineEdit复制了一个例子。
是否可以做类似的事情?
致电findChildren
对我没有帮助,因为我不知道我的复选框在我的应用程序中的位置,或者"谁是谁"那里。也不可能通过ObjectName调用,是吗?
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.gridLayout = QtGui.QGridLayout(Form)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.My_lineEdit = QtGui.QLineEdit(Form)
self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit"))
self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
MyStrinng = 'My_lineEdit'
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.Mystring.clear)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
像这样,PyQt
无法识别我的字符串作为对象的名称。我还尝试使用PyQt
制作QCore.QString('My_lineEdit')
字符串,但我的版本(you can see here)无法使用QString
有了这个,我可以重现所有复选框的名称。
names = []
for x in range(0, 6):
for y in range(0, 6):
for z in range(1, 5):
Names = 's'+str(x)+str(y)+'0'+str(z)
names.append(Names)
print(names)
答案 0 :(得分:2)
如果要按对象查找对象,最简单的选项是使用findChild()
:
T QObject :: findChild(const QString& name = QString(), Qt :: FindChildOptions options = Qt :: FindChildrenRecursively)const
返回此对象的子对象,可以将其强制转换为T类型 被称为名称,如果没有这样的对象,则为0。省略名字 参数导致所有对象名称匹配。搜索是 除非options指定选项,否则递归执行 FindDirectChildrenOnly。
如果有多个匹配搜索的子项,则最直接 祖先归来。如果有几个直接的祖先,那就是 未定义哪一个将被退回。在那种情况下,findChildren() 应该使用。
此示例返回名为parentWidget的子QPushButton “button1”,即使该按钮不是父项的直接子项:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
文档中的C ++示例将转换为以下形式的python:
button = parentWidget.findChild(QPushButton, "button1")
在你的情况下:
class Ui_Form(object):
def setupUi(self, Form):
...
# change self.lineEdit to self.My_lineEdit
#Form is the parent of My_lineEdit
self.My_lineEdit = QtGui.QLineEdit(Form)
self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit"))
self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
...
le = Form.findChild(QtGui.QLineEdit, "My_lineEdit")
self.pushButton.clicked.connect(le.clear)