从列表中调用再现对象名称的对象

时间:2017-08-13 21:20:59

标签: python pyqt pyqt4 qcheckbox

我正在创建一个包含许多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)

1 个答案:

答案 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)