Вы можете использовать findChildren()
и findChild()
:
Возвращает всех потомков этого объекта с заданным именем, которое может быть приведено к введите T или пустой список, если таких объектов нет.
Обратите внимание, что в PyQt имеется больше перегрузок этих методов, которые немного отличаются по своим аргументам, и вы Вы, вероятно, заинтересованы в первом из них:
findChild (type, name: str = '', параметры: Union [FindChildOptions, FindChildOption] = FindChildrenRecursively *
findChildren (type , name: str = '', options: Union [FindChildOptions, FindChildOption] = FindChildrenRecursively)
def move_ligne_one(self):
for btn in self.findChildren(QtWidgets.QLabel, QtCore.QRegExp(r'^label_ligne_1_[1-4]')):
if self.findChild(QtWidgets.QLabel, 'label_ligne_1_4').x() > 300:
p = btn.pos()
p -= QtCore.QPoint(85, 0)
btn.move(p)
Обратите внимание, что если вы используете setattr
, вы можете получить доступ к виджетам аналогичным образом: просто вызов getattr
:
def move_ligne_one(self):
for btn in (
getattr(self, 'label_ligne_1_1'),
getattr(self, 'label_ligne_1_2'),
getattr(self, 'label_ligne_1_3'),
getattr(self, 'label_ligne_1_4'),
):
# ...
В любом случае, если у вас будет фиксированное количество строк и столбцов, проще и лучше будет создать «матрицу» ваших виджетов:
self.rows = []
for row in range(4):
rowItems = []
self.rows.append(rowItems)
for col in range(4):
square = QtWidgets.QLabel(self)
rowItems.append(square)
def move_ligne_one(self):
for btn in self.rows[0]:
# ...
Таким образом, вы можете получить доступ к каждой ите м по положению, что лучше, чем полагаться на имена объектов или атрибуты экземпляров.