PyQT5 как узнать индекс позиции виджета, который находится на лейауте?

У меня есть QFrame с разметкой QHBoxLayout, на котором расположено 6 кнопок QPushButton.

Есть ли возможность получить позицию (индекс) конкретной кнопки на QHBoxLayout непосредственно из самой кнопки?


Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

int QLayout::indexOf(const QWidget *widget) const

Ищет виджет widget в этом макете (не включая дочерние макеты).

Возвращает индекс виджета или -1, если виджет не найден.

import sys
from PyQt5.Qt import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.frame_1 = QFrame()
        self.frame_2 = QFrame()
        
        self.layout_main = QVBoxLayout(self)
        self.layout_main.addWidget(self.frame_1, 1)
        self.layout_main.addWidget(self.frame_2, 
            alignment=Qt.AlignHCenter | Qt.AlignBottom)
        
        self.label = QLabel(alignment=Qt.AlignCenter)
        self.layout_1 = QHBoxLayout(self.frame_1)
        self.layout_1.addWidget(self.label)
        
        self.layout_2 = QHBoxLayout(self.frame_2)
        for i in range(5):
            btn = QPushButton(
                'Button {}'.format(i),
                clicked=self.on_clicked
            )
            self.layout_2.addWidget(btn)

    @pyqtSlot()
    def on_clicked(self):
        btn = self.sender()
        ix = self.layout_2.indexOf(btn)
        text = f'{btn.text()}: индекс = {ix}'
        self.label.setText(text)
        
        new_btn = QPushButton(
            "button {}".format(self.layout_2.count()),
            clicked=self.on_clicked
        )
        self.layout_2.insertWidget(ix+1, new_btn)
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setFont(QFont("Times", 12, QFont.Bold))
    w = MainWindow()
    w.resize(700, 500)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка