gpt4 book ai didi

python - 设置ObjectName,然后在函数中调用它

转载 作者:行者123 更新时间:2023-12-01 06:28:05 25 4
gpt4 key购买 nike

我在 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)

enter image description here

我需要通过按相应的按钮来单独移动每行标签。但我无法使用我分配的名称来引用标签

最佳答案

您可以使用findChildren()findChild() :

Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects.

请注意,使用 PyQt 有 more overloads这些方法的参数略有不同,您可能对第一个感兴趣:

findChild(type, name: str = '', options: 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]:
# ...

通过这种方式,您可以通过位置访问每个项目,这比依赖对象名称或实例属性更好。

关于python - 设置ObjectName,然后在函数中调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60030813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com