Вызов объектов из списка, который воспроизводит имена объектов
Я создаю приложение, которое имеет много флажков. Каждые 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)