Вызов объектов из списка, который воспроизводит имена объектов

Я создаю приложение, которое имеет много флажков. Каждые 4 флажка находятся внутри groupBox_n (n=36), и эти групповые ящики находятся затем внутри другого группового ящика.

Каждый 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'), но 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 ответ

Решение

Если вы хотите найти объект по его объекту, самый простой вариант - использовать findChild():

T QObject:: findChild (const QString & name = QString (), Qt:: FindChildOptions options = Qt:: FindChildrenRecursively) const

Возвращает дочерний элемент этого объекта, который может быть приведен к типу T и который называется name, или 0, если такого объекта нет. Пропуск аргумента name приводит к совпадению всех имен объектов. Поиск выполняется рекурсивно, если в параметрах не указан параметр FindDirectChildrenOnly.

Если поиск соответствует нескольким дочерним элементам, возвращается самый прямой предок. Если есть несколько прямых предков, не определено, какой из них будет возвращен. В этом случае следует использовать findChildren().

В этом примере возвращается дочерний QPushButton для parentWidget с именем "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)
Другие вопросы по тегам