Установите ObjectName и затем вызовите его в функции - PullRequest
1 голос
/ 03 февраля 2020

Я создаю эти метки, используя это в 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

Мне нужно переместить каждый ряд этикеток по отдельности, нажав соответствующую кнопку. Но я не могу ссылаться на метки, используя назначенное им имя

1 Ответ

1 голос
/ 03 февраля 2020

Вы можете использовать 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]:
        # ...

Таким образом, вы можете получить доступ к каждой ите м по положению, что лучше, чем полагаться на имена объектов или атрибуты экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...