Qt Python: Как получить доступ к элементам интерфейса?

Всем добра!

Решил попробовать написать программу на питоне в связке с QT с интерфейсом. Однако, столкнулся с проблемой доступа к интерфейсу.

Что имею: QT 5.15, QT Creator 4.13.3, через терминал установлены PySide2, PyQt5

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

Далее, начал работать в редакторе с интерфейсом: добавил нужные кнопки, разместил поля, метки. Проект запускается. Все хорошо.

Но, я не могу получить доступ к кнопке, чтобы приконнектить слот или получить значение из поля (Qlineedit).

Вот код:

# This Python file uses the following encoding: utf-8
import sys
import os


from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


class Home(QWidget):
    def __init__(self):
        super(Home, self).__init__()
        self.load_ui()
        self.pushButton.clicked.connect(self.greetings) # Здесь выдает ошибку, что pushButton не существует, но на форме он есть. Как к нему получить доступ?

    def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()

    def greetings(self):
        print ("Hello %s" % self.edit.text())


if __name__ == "__main__":
    app = QApplication([])
    widget = Home()
    widget.setWindowTitle('Home')
    widget.show()
    sys.exit(app.exec_())

Как же получить доступ к pushButton на форме?


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

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

я проверил ваше приложение для PyQt5 - работает.

Как должно быть для PySide2, предполагаю что так как я отметил в тексте кода. Не проверено. Проверьте пожалуйста.

import sys
import os

'''
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
'''
from PyQt5.Qt import *
from PyQt5 import uic


class Home(QWidget):
    def __init__(self):
        super(Home, self).__init__()
        
        self.load_ui()
        
#        self.ui.pushButton.clicked.connect(self.greetings)        # PySide2 
        self.pushButton.clicked.connect(self.greetings)            # PyQt5

    def load_ui(self):
#        self.ui = QUiLoader().load("form.ui")                     # PySide2   !!! self.ui
        uic.loadUi("form.ui", self)                                # PyQt5 

    def greetings(self):
#        print ("Hello %s" % self.ui.edit.text())                  # PySide2
        print ("Hello %s" % self.edit.text())                      # PyQt5


if __name__ == "__main__":
    app = QApplication([])
    widget = Home()
    widget.setWindowTitle('Home')
    widget.show()
    sys.exit(app.exec_())
→ Ссылка
Автор решения: Larboss

Решение найдено. Благодаря подсказкам S. Nick понял, что нужно делать.

Интересно то, что генерируемый Qt Creator'ом код не дает доступа к ui, хотя и загружает его. Сгенерированный код:

def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()

Чтобы получить доступ к ui достаточно в строке loader.load(ui_file, self) дописать self.ui =, идентифицировав его таким образом.

Итоговый код выглядит так:

# This Python file uses the following encoding: utf-8
import sys
import os


from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


class Home(QWidget):
    def __init__(self):
        super(Home, self).__init__()
        self.load_ui()
        self.ui.pushButton.clicked.connect(self.greetings)


    def load_ui(self):
        loader = QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        self.ui = loader.load(ui_file, self) # Идентифицировали ui
        ui_file.close()

    def greetings(self):
        print ("Hello %s" % self.ui.edit.text())

if __name__ == "__main__":
    app = QApplication([])
    widget = Home()
    widget.setWindowTitle('Home')
    widget.show()
    sys.exit(app.exec_())
→ Ссылка