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_LogInWindow 和 Ui_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.ui
s 的值。尝试这样的事情:self.loginWindow = QtWidgets.QDialog(MainWindow)
self.loginWindow.ui = Ui_LogInWindow()
self.loginWindow.ui.setupUi(self.loginWindow)
相应地适应 ProfileWindow以上是关于PyQt5如何在主UI中实例化多个UI的主要内容,如果未能解决你的问题,请参考以下文章
Python+PyQT5的子线程更新UI界面的实例《新手必学》
Unity XR Single Pass 实例化渲染和 UI