PyQt5:使用设计器创建多个视图,并将它们连接到一个应用程序

时间:2017-11-25 05:44:31

标签: python qt pyqt

我在PyQt5中完成了一个简单的应用程序,我在QT设计器中设计了UI,用pyuic5转换为py代码并通过python解释器运行。

现在我想添加另一个UI视图,虽然我不熟悉PyQt5,我发现的大部分教程都只提到了一个视图。 例如,如果我使用Visual Studio,我可以创建一个新表单,并使用show和hide方法显示它们,例如,当我按下按钮时,我不知道如何使用PyQt5执行相同操作。

来自pyuic5的转换代码还包括if __name__ == "__main__"函数,它创建实例并运行应用程序,因此仅仅获取其上方的任何内容就足以获取UI数据了吗?如何从中创建视图,以便根据需要显示和隐藏它?感谢

EDIT ============================= 进一步,因为我发现了一种加载UI文件的不同方式。似乎PyQt有一个方法能够直接加载UI文件,而不是在python代码中转换它。这意味着我可以创建一个类,它是我正在使用的窗口类型的子类(例如:QApplicationQMainWindowQWidget等等,我可以访问该对象就像它是Visual Studio中的一个表单一样。

from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
from PyQt5.uic import loadUI

class UIObject(QMainWindow):

    def __init__(self):
        super(UIObject, self).__init__()
        loadUI('mainapp.ui`, self)
        self.mybutton1.clicked.connect(self.printhello)

    def printhello():
        print("hello")

app = QApplication(sys.argv)
mainview = UIObject()
mainview.show()
sys.exit(app.exec_())

这将加载UI文件并在屏幕上显示;我假设我可以使用相同的构造来加载多个ui文件,然后像在Visual Studio中那样显示或隐藏它们?看起来很简单,但对QT或PyQT了解不多,我不知道为什么这种处理ui文件的方式在教程中并不常见。我在阅读文档时偶然发现了它。

1 个答案:

答案 0 :(得分:1)

找到解决方案,混合来自不同论坛的各种答案和帖子。

您在QMainWindow中使用__init__创建第一个类loadUi来加载QT设计器文件。然后你创建了第二个类,它是一个保存你的第二个表单/视图的类,并在__init__中作为参数传递父视图(你的第一个类,或者你可能需要的任何其他类);这样您可以隐藏主视图并在单击按钮时显示第二个视图。关闭辅助视图时,上一个视图将再次显示。

您可以添加任意数量的不同窗口;诀窍是总是在每个上传递父项,并记住相应地显示/隐藏它们。比Visual Studio形式复杂得多,但它是可行的。

class FirstForm(QMainWindow):

    def __init__(self):
        super(FirstForm, self).__init__()
        loadUi('firstform.ui', self)
        self.button1.clicked.connect(self.openOtherForm)

    def openOtherForm(self):
        self.hide()
        otherview = SecondForm(self)
        otherview.show()

class SecondForm(QDialog):

    def __init__(self, parent=None):
        super(SecondForm, self).__init__(parent)
        loadUi('secondform.ui', self)
        self.button2.clicked.connect(self.goBackToOtherForm)

    def openOtherForm(self):
        self.parent().show()
        self.close()

app = QApplication(sys.argv)
main = FirstForm()
main.show()
sys.exit(app.exec_())