Выдает ошибку при вызове функции clicked.connect(), когда интерфейс загружается через QUiloader()

   <widget class="QPushButton" name="pushButton_4">
    <property name="geometry">
     <rect>
      <x>325</x>
      <y>220</y>
      <width>150</width>
      <height>100</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>16</pointsize>
     </font>
    </property>
    <property name="text">
     <string>Start checking</string>
    </property>
   </widget>
import os
from pathlib import Path
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import Qt, QFile, QCoreApplication
from PySide6.QtQuick import QQuickWindow, QSGRendererInterface
from PySide6.QtUiTools import QUiLoader


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

    def load_ui(self):
        loader = QUiLoader()
        path = os.fspath(Path(__file__).resolve().parent / "mainwindow.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()


if __name__ == "__main__":
    QCoreApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
    QQuickWindow.setGraphicsApi(QSGRendererInterface.OpenGLRhi)

    app = QApplication(sys.argv)
    window = MainWindow()
    window.pushButton_4.clicked.connect(lambda: print("clicked"))
    window.show()

    sys.exit(app.exec())

AttributeError: 'MainWindow' object has no attribute 'pushButton_4'


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

Автор решения: Alexander Chernin

Да, тут есть один затык, поэтому делать надо так (через поле-посредник):

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

    def load_ui(self):
        loader = QUiLoader()
        ...

        # Возвращаем объекты интерфейса в поле ui (можно выбрать любое другое имя переменной)
        self.ui = loader.load(ui_file, self)

        ui_file.close()


if __name__ == "__main__":
    ...

    # Получаем доступ к кнопке через поле ui
    window.ui.pushButton_4.clicked.connect(lambda: print("clicked"))
    window.show()

    sys.exit(app.exec())
→ Ссылка