Как создать виджет, используя файл .ui? - PullRequest
1 голос
/ 07 мая 2019

Я бы хотел создать виджет внутри MainWindow, который получает свой дизайн из файла, созданного с помощью QtDesigner.

  • файл .ui, который я создал, - test.ui
  • У меня есть экземпляр MainWindow, унаследованный от QMainWindow, который создаст составной виджет со многими виджетами внутри него. Для простоты в этом примере он создаст только виджет как центральный виджет .
  • Экземпляр My Widget внутри MainWindow - это тот, который должен получить свой дизайн из файла .ui

Как есть, приложение показывает пустое окно

Вот код:

from PySide2.QtWidgets import QMainWindow, QApplication, QDesktopWidget, QWidget
from PySide2.QtCore import QCoreApplication, Qt

from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile

class MyWidget(QWidget):
    def __init__(self, parent=None):        
        super(MyWidget, self).__init__(parent)

    ui_file = QFile("test.ui")
    ui_file.open(QFile.ReadOnly)

    loader = QUiLoader()
    window = loader.load(ui_file)
    ui_file.close()


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui_dim_percentage = 70/100
        self.initUI()

    def initUI(self):
        self.center()

        self.home_widget = MyWidget(self)
        self.setCentralWidget(self.home_widget)

        self.show()

    def center(self): # resizes the UI to a percentage of the screen and centers the widget

        screen_size = QDesktopWidget().screenGeometry()
        self.resize(screen_size.width()*self.ui_dim_percentage, screen_size.height()*self.ui_dim_percentage)

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


def main():

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Как мне исправить код?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Проблема в том, что вы путаете понятия, когда вы используете QUiLoader, вы создаете окно, которое в данном случае является переменной window, которая является локальной переменной, то есть .ui не заполняет MyWidget.

Решение не в том, чтобы создать класс MyWidget, просто используйте переменную окна.

from PySide2.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader


def create_widget():
    ui_file = QFile("test.ui")
    if ui_file.open(QFile.ReadOnly):
        loader = QUiLoader()
        window = loader.load(ui_file)
        ui_file.close()
        return window


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui_dim_percentage = 70 / 100
        self.initUI()

    def initUI(self):
        self.center()

        self.home_widget = create_widget()
        self.setCentralWidget(self.home_widget)

        self.show()

    # resizes the UI to a percentage of the screen and centers the widget
    def center(self):

        screen_size = QDesktopWidget().screenGeometry()
        self.resize(
            screen_size.width() * self.ui_dim_percentage,
            screen_size.height() * self.ui_dim_percentage,
        )

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


def main():
    import sys

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
0 голосов
/ 07 мая 2019

Вы пытались конвертировать ваш ui-файл?

Вы можете использовать команду pyuic4 на оболочке:

pyuic4 test.ui -o test.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...