我正在initUI(self)中使用此标签创建这些标签:
for row in range(4):
tmp = 0
for col in range(4):
square = QtWidgets.QLabel(self)
square.setPixmap(QtGui.QPixmap('img/tab.png'))
#self.gridLayout.addWidget(square, row, col)
#setattr(self, 'label_ligne_{}_{}'.format(row + 1, col + 1), square)
label_name='label_ligne_{}_{}'.format(row + 1, col + 1)
square.setObjectName(label_name)
if row <1:
test=300
elif row <2:
test=385
elif row <3:
test=470
else:
test =555
square.move(300 + tmp, test)
square.installEventFilter(self)
print(square.objectName())
tmp += 85
我想在按钮触发的功能中添加一些标签:
@pyqtSlot()
def on_click(self):
print('PyQt5 button click')
def move_ligne_one(self):
for btn in (
self.label_ligne_1_1,
self.label_ligne_1_2,
self.label_ligne_1_3,
self.label_ligne_1_4,
):
if self.label_ligne_1_4.x() > 300:
p = btn.pos()
p -= QtCore.QPoint(85, 0)
btn.move(p)
我需要通过按相应的按钮分别移动标签的每一行。但是我无法使用我为其分配的名称来引用标签
您可以使用findChildren()
和findChildren()
:
返回具有给定名称的该对象的所有子代,可以强制转换为T类型;如果没有此类对象,则返回一个空列表。
请注意,使用PyQt的这些方法中有findChild()
个,它们的参数略有不同,您可能会对其中第一个感兴趣:
findChild(type,name:str ='',选项:Union [FindChildOptions,FindChildOption] = FindChildrenRecursively)
findChildren(类型,名称:str ='',选项:Union [FindChildOptions,FindChildOption] = FindChildrenRecursively)]
findChild()
请注意,如果您使用more overloads,则可以通过简单地调用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
通过这种方式,您可以按位置访问每个项目,这比依赖对象名称或实例属性要好。