Я изучаю pyqt5 и, в частности, как использовать его с QT Designer. Я как-то слежу за туртоном ЗДЕСЬ. Однако в этом руководстве они преобразуют XML-интерфейс в код Python с pyuic5, в то время как я пытаюсь импортировать его динамически с помощью uic.loadUi("myui.ui"). В учебнике мы определяем слот с сигналами и слот-редактором с именем "browseSlot". Когда я пытаюсь запустить/скомпилировать, на линии
dlg = uic.loadUi("myui.ui")
Я получаю сообщение об ошибке:
AttributeError: объект "QMainWindow" не имеет атрибута "browseSlot"
Я думаю, что происходит то, что QT Designer связывает сигнал с слотом "browseSlot", но поскольку метод "browseSlot" не определен в myui.ui, возникает ошибка, потому что интерпретатор не знает Я имею в виду метод, который находится вне файла интерфейса интерфейса. (В этом случае в модуле, который загружает интерфейс). Насколько я могу судить, QT Designer позволяет мне подключать сигналы к слотам, а не определять совершенно новый. Я думаю, что таким образом это обрабатывается в других рамках, так это то, что будет абстрактный метод, который нуждается в верховой езде. Так что я могу сделать в этой ситуации, чтобы заставить его работать?
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import QObject, pyqtSlot
import sys
app = QtWidgets.QApplication([])
dlg = uic.loadUi("myui.ui")
@pyqtSlot
def returnPressedSlot():
pass
@pyqtSlot
def writeDocSlot():
pass
@pyQt
def browseSlot():
pass
dlg.show()
sys.exit(app.exec())
Слоты принадлежат классу, который используется, возвращает loadUi()
, они не являются никакими функциями, так как они не магически не соединяют их, если вы хотите использовать loadUi()
и реализовать эти методы, которые вы должны наследовать от класса, соответствующего шаблону который вы использовали, в примере основного окна ссылки было использовано так, чтобы оно было унаследовано от QMainWindow
:
from PyQt5 import QtCore, QtGui, QtWidgets, uic
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
uic.loadUi("mainwindow.ui", self)
@QtCore.pyqtSlot()
def returnPressedSlot():
pass
@QtCore.pyqtSlot()
def writeDocSlot():
pass
@QtCore.pyqtSlot()
def browseSlot():
pass
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())