Загрузка файла пользовательского интерфейса qdesigner из скрипта python с использованием pyqt5

Я попытался загрузить файл Ui из скрипта Python следующим образом.

from PyQt5 import uic, QtWidgets
import sys

class Ui(QtWidgets.QDialog):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('SomeUi.ui', self)
        self.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    sys.ex

Когда я отлаживаю и дохожу до строки window = Ui(), у меня появляется ошибка:

-> window = Ui()
(Pdb) n
TypeError: TypeErro...ndow')),)

Что не так с моим кодом?

Файл SomeUi.ui, вероятно, имеет QMainWindow в качестве виджета верхнего уровня, но ваш класс Ui наследуется от QDialog - отсюда ошибка типа. Если вы используете class Ui(QtWidgets.QMainWindow), код должен работать (хотя последняя строка должна быть app.exec()).

ekhumoro 29.10.2018 13:37
0
1
979
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете скомпилировать файл .ui в файл .py с помощью утилиты пюик, которая является частью PyQt.

  1. Найдите утилиту где-нибудь в dist-пакетах python, например, в моей системе (debian linux), она находится в

    /usr/lib/python3/dist-packages/PyQt5/uic/pyuic.py
    
  2. Запустите его с помощью python, указав исходный файл .ui и параметр -o с файлом результата py.

    cd /usr/lib/python3/dist-packages/PyQt5/uic/
    python3 ./pyuic.py /home/user/my-app/my-file.ui -o /home/user/my-app/my-file.py
    
  3. Вы получите файл .py, который будет содержать что-то вроде этого:

    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(555, 470)
            // and so on... lots of lines...
    
  4. Импортируйте этот файл и создайте подкласс этого Ui_MainWindow (имя может быть другим) своим классом окна.

Я думал, что могу вызвать этот файл SomeUi.ui напрямую.

batuman 26.10.2018 10:51

Если вы внимательно прочитаете документацию (pyqt.sourceforge.net/Docs/PyQt5/designer.html), вы обнаружите, что класс uic.loadUi RETURNS, который вы должны создать для использования интерфейса.

MihanEntalpo 26.10.2018 11:32

Другие вопросы по теме