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 шт):
я проверил ваше приложение для 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_())
Решение найдено. Благодаря подсказкам 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_())
