我在PyQt5中完成了一个简单的应用程序,我在QT设计器中设计了UI,用pyuic5
转换为py代码并通过python解释器运行。
现在我想添加另一个UI视图,虽然我不熟悉PyQt5,我发现的大部分教程都只提到了一个视图。 例如,如果我使用Visual Studio,我可以创建一个新表单,并使用show和hide方法显示它们,例如,当我按下按钮时,我不知道如何使用PyQt5执行相同操作。
来自pyuic5
的转换代码还包括if __name__ == "__main__"
函数,它创建实例并运行应用程序,因此仅仅获取其上方的任何内容就足以获取UI数据了吗?如何从中创建视图,以便根据需要显示和隐藏它?感谢
EDIT =============================
进一步,因为我发现了一种加载UI
文件的不同方式。似乎PyQt有一个方法能够直接加载UI文件,而不是在python代码中转换它。这意味着我可以创建一个类,它是我正在使用的窗口类型的子类(例如:QApplication
,QMainWindow
,QWidget
等等,我可以访问该对象就像它是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
文件的方式在教程中并不常见。我在阅读文档时偶然发现了它。
答案 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_())