Как получить единое окно с разными классами пользовательского интерфейса с PyQt5? - PullRequest
1 голос
/ 27 мая 2020

Могу ли я использовать разные классы пользовательского интерфейса, которые будут отображаться в определенной части окна, но все же использовать одно окно? Это будет похоже на элементы <div></div> на HTML. Я пробовал, как показано ниже, но self.header метка не отображалась после нажатия self.some_button

MainUi.py

from PyQt5 import QtWidgets, QtCore

class UserInterface(QtWidgets.QMainWindow):
    # As Main Window, every widget will always be displayed

    def setupUi(self, MainWindow):
        MainWindow.resize(800, 600)
        MainWindow.setWindowTitle("WindowTitle")
        self.centralWidget = QtWidgets.QWidget(MainWindow)

        self.main_title = QtWidgets.QLabel(self.centralWidget)
        self.main_title.setText("Some text")

        self.some_button = QtWidgets.QPushButton(self.centralWidget)
        self.some_button.move(20, 20)
        self.some_button.setText("Some Button")
        self.some_button.adjustSize()

        MainWindow.setCentralWidget(self.centralWidget)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)


class AboutPerson(QtWidgets.QWidget):
    # As widget class, will be shown on a certain part of the main window

    def __init__(self, parent=None, person=None):
        super().__init__(parent)
        self.header = QtWidgets.QLabel()
        self.header.move(40, 0)
        self.header.setText(f"Some header {person}")

        self.show()

MainControl.py

from PyQt5 import QtWidgets

from MainUi import *

class ControlMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.main_ui = UserInterface()
        self.main_ui.setupUi(self)

        self.main_ui.some_button.clicked.connect(self.draw_about)

    def draw_about(self):
        self.about_ui = AboutPerson(self.main_ui, 'John')


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    program = ControlMainWindow()
    program.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 27 мая 2020

Виджет будет отображаться в окне, если он является дочерним элементом окна или дочерним элементом виджета, уже отображаемого в окне. «self.about_ui», если он отображается в окне, поскольку он является дочерним элементом окна, а «заголовок» - нет, поскольку он не является дочерним элементом ни окна, ни «self.about_ui». Одно из решений - передать родителю:

self.header = QtWidgets.QLabel(<b>self</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...