pyqt5, Receiving AttributeError: у объекта 'QMainWindow' нет атрибута 'browseSlot' - PullRequest
0 голосов
/ 24 сентября 2018

Я изучаю 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, выдается ошибка, потому что интерпретатор не может узнать, что я имею в виду метод, который находится за пределами файла интерфейса 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())

1 Ответ

0 голосов
/ 24 сентября 2018

Слоты принадлежащие используемому классу возвращают 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...