PyQt5如何在主UI中实例化多个UI

Posted

技术标签:

【中文标题】PyQt5如何在主UI中实例化多个UI【英文标题】:PyQt5 How to Instantiate Multiple Ui in Main Ui 【发布时间】:2017-02-25 17:28:11 【问题描述】:

我需要在我的 MainWindow 中实例化 2 Ui。如果我只实例化 1 个 Ui,则此代码有效:

    self.loginWindow = QtWidgets.QDialog(MainWindow)
    self.ui = Ui_LogInWindow()
    self.ui.setupUi(self.loginWindow)
    self.loginWindow.setModal(True)
    self.loginWindow.show()

但是,当我尝试为我的其他 Ui 执行此操作时,它会产生错误:

    self.loginWindow = QtWidgets.QDialog(MainWindow)
    self.ui = Ui_LogInWindow()
    self.ui.setupUi(self.loginWindow)
    self.loginWindow.setModal(True)
    self.loginWindow.show()


    self.profileWindow = QtWidgets.QDialog(MainWindow)
    self.ui = Ui_ProfileWindow()
    self.ui.setupUi(self.profileWindow)
    self.profileWindow.setModal(True)
    #self.profileWindow.show()

问题是,我的 MainWindow 中的 Ui_LogInWindowUi_ProfileWindow 都需要小部件。如果我不能正确实例化这两者,我不知道如何让它工作。我是 PyQt 和 Python 的新手,这就是为什么我不太了解语法的原因。帮助将不胜感激。谢谢!

【问题讨论】:

我不太明白你想要什么。你能提供一个最小的工作示例吗?或者一张照片,也许? 我的意思是,我如何在我的主 ui 中实例化两个或多个 Ui。我不理解实例化中父子关系的概念,这就是为什么上面显示的代码的第二部分不起作用的原因;并且第一个显示的代码有效。 所以您希望在一个窗口上同时显示 2 个不同的 UI?您期望它的外观如何:并排,相互叠加?或者你想要两个可以独立显示的独立窗口? 两个独立的窗口,可以独立显示。你看,我在每个窗口内都有稍后将使用的小部件,并且连接到我的主窗口内的小部件。这就是为什么,我需要学习如何在我的主 Ui 中实例化两个或多个 Ui 您试图同时拥有多个模态窗口的尝试打破了窗口模态的概念。您可能想要的是无模式窗口。更多关于 Qt 模式的信息在这里doc.qt.io/qt-4.8/qdialog.html#details 【参考方案1】:

问题是您在类的一个实例中设置了两个 UI。与其这样做,不如为每个窗口创建两个单独的类。

一个双窗口应用的小例子。

import sys

from PyQt5 import QtWidgets


class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 200, 100)
        self.button = QtWidgets.QPushButton('Wow such button', self)
        self.button.move(40, 20)


class App2(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(400, 100, 200, 200)
        self.editor = QtWidgets.QTextEdit('Wow such text', self)
        self.editor.setGeometry(20, 20, 160, 160)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    gui = App()
    gui2 = App2()
    gui.show()
    gui2.show()
    app.exec_()

请注意,不必一次创建所有窗口。我稍微修改了上面的例子,所以现在启动时只显示第一个窗口。您可以使用按钮来切换第二个窗口的可见性。

import sys

from PyQt5 import QtWidgets


class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 200, 100)
        self.button = QtWidgets.QPushButton('Toggle second window', self)
        self.button.setGeometry(20, 20, 160, 30)

        self.app2 = App2()
        self.button.clicked.connect(self.toggle_app2)

    def toggle_app2(self):
        if self.app2.isHidden():
            self.app2.show()
        else:
            self.app2.hide()


class App2(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(400, 100, 200, 200)
        self.editor = QtWidgets.QTextEdit('Wow such text', self)
        self.editor.setGeometry(20, 20, 160, 160)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    gui = App()
    gui.show()
    app.exec_()

希望这会为您指明正确的方向

【讨论】:

感谢您的回复。但是,我有 3 个 .py 文件,其中包含我的 Uis。 1 用于我的主窗口(将调用两个 ui 文件),1 用于其他两个。我如何执行你刚刚告诉我的内容?根据我对您的回复的理解,另外两个 ui 是在主窗口内制作的;这不是我的情况。多谢。给你点赞 当我需要导入我的其他 2 个 ui 时,我如何实现您刚才所说的,以便我可以使用 em 中的小部件?此外,我的 2 个 ui 都位于 2 个不同的 .py 文件中。我希望这能消除我的担忧。非常感谢 好吧,只需在主窗口文件中导入两个 UI 并在主窗口的 __init__ 中创建它们的实例。之后,您将能够访问他们的小部件。 实例化两个 UI 时出现错误。但是当我只实例化 1 个 UI 时,它不会产生任何错误。当我实例化两个 UI 时出现此错误:AttributeError: 'Ui_ProfileWindow' object has no attribute 'LogIn' 我已经实例化了我的两个 UI,就像我的问题中的 UI 一样(删除了 .setModal(True) 的行)。 LogIn 是我其他 UI 中的一个按钮。 那是因为你覆盖了self.uis 的值。尝试这样的事情:self.loginWindow = QtWidgets.QDialog(MainWindow) self.loginWindow.ui = Ui_LogInWindow() self.loginWindow.ui.setupUi(self.loginWindow) 相应地适应 ProfileWindow

以上是关于PyQt5如何在主UI中实例化多个UI的主要内容,如果未能解决你的问题,请参考以下文章

Python+PyQT5的子线程更新UI界面的实例《新手必学》

Unity UI 缩放和实例化预制件

Unity XR Single Pass 实例化渲染和 UI

pyqt5通过qt designer 设计方式连接多个UI图形界面

Unity3D日常开发UI预制体的实例化实操演示

Unity3D日常开发UI预制体的实例化实操演示