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

2024-04-25 06:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要按相应的按钮分别移动每行标签。但是我不能使用我指定的名称来引用标签


Tags: intestselfformatformoverangecol
1条回答
网友
1楼 · 发布于 2024-04-25 06:19:19

您可以使用^{}^{}

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]:
        # ...

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

相关问题 更多 >