python - 设置 ObjectName,然后在函数中调用它
问题描述
我在 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()
和findChild()
:
返回此对象的所有具有给定名称的子对象,这些子对象可以转换为类型 T,如果没有此类对象,则返回一个空列表。
请注意,对于 PyQt,这些方法有更多的重载,它们的参数略有不同,您可能对其中的第一个感兴趣:
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]:
# ...
通过这种方式,您可以通过位置访问每个项目,这比依赖对象名称或实例属性要好。
推荐阅读
- azure - 使用 sap .net 连接器将逻辑应用程序连接到 sap hana 服务器时出错
- node.js - Node JS 手动处理 HTTP 重定向并保留 cookie
- css - 如果输入已经填写,VueJS会更改输入的边框颜色
- python - 用python从左到右解码二维码
- php - 让本地 Symfony 2.8 应用程序像在 prod 环境中一样运行
- java - InputStream 不从 JAR 中读取某些文件
- r - 求一个变量被另一个变量子集化的平均值
- proxy - ddev 在代理后面使用 drush 无法连接
- reactjs - 从 powershell 在 Appveyor 上运行 Jest 测试
- swift - 使用来自 django-allauth 的访问令牌登录 Spotify iOS SDK