2017-08-13 190 views
-1

我创建了一个包含许多复选框的应用程序。每4个复选框位于groupBox_n(n = 36)内,然后这些组框位于另一个组框中。从复制对象名称的列表中调用对象

每个复选框都按照一定的规则命名,这对我来说非常方便。我想访问他们每个人,但我不想每次输入他们的名字。所以我尽管关于在列表中重现他们的名字,以便我可以遍历列表并控制,取决于他们的名字。

但是,当我尝试连接一个按钮,从我的列表中调用一个字符串,我无法做到这一点。这里我用QLineEdit重现了一个例子。

是否有可能做这样的事情?

调用findChildren不能帮助我,因为那时我不知道我的checkBox在我的应用程序中的位置或“谁是谁”在那里。通过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'),但QString不适用于我的版本(you can see here)

这个我可以重现我所有的复选框的名称。

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) 
+1

你想让你的objectName的每个复选框? – eyllanesc

+0

当我得到一个列表时,哪个框是重要的。 我不知道我可以在搜索中指定名称。谢谢! 你认为我能以某种方式将它与我创建的名称列表进行比较吗?类似于Mylist中的名称:myList = parentWidget.findChild(QPushButton,“name”)' –

+0

是的,如果可以的话,但更好地解释自己。根据你的问题你有一个名称模式,你可以为你想要的东西放置一个有效的例子。 – eyllanesc

回答

2

如果你想找到它的对象的对象,最简单的选择是使用findChild()

牛逼的QObject :: findChild(常量QString的&名= QString的(), 的Qt :: FindChildOptions选项= Qt的:: FindChildrenRecursively)const的

返回此对象可以被铸造成T类型的儿童和 被称为名称,或0,如果疗法e不是这样的对象。省略名称 参数会导致所有对象名称匹配。搜索是 递归执行,除非选项指定选项 FindDirectChildrenOnly。

如果有多个子项匹配搜索,则返回最直接的 祖先。如果有几个直接的祖先,它是 未定义哪一个将被返回。在这种情况下,应该使用findChildren() 。

此示例返回一个孩子parentWidget的QPushButton命名 “Button1的”,即使按钮不是父母的直接子:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1"); 

在C++的例子是在文档中将被转换为以下形式的蟒蛇:

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)