在学习PyQt5+Qt Designer过程中,在QInputDialog对话框中或QMessageBox消息框中,点击按钮Button都会自动弹出一个对话框,这些对话框都是系统自带的,现在我们需要自定义一个“弹出对话框”,参考了网上一些例子,可使用代码编写的形式创建主窗口和子窗口,然后经过信号和槽函数调用来实现,具体实例可参考:
1、各位大神,求问pyqt5如何实现点击一个按钮跳出另一个窗口?
https://bbs.csdn.net/topics/390965991 此论坛中有几个很好的例子。
2、【知乎网】https://zhuanlan.zhihu.com/p/30152208
但是对于复杂一点的应用系统,完全使用代码编写太不现实,则需要使用快捷的创建方法,即使用Qt Designer创建主窗口和子窗口(被调用窗口),这时如何实现它们之间的调用?
下面给出它们之间的调用方法:
工具:PyQt5+Qt designer + Pycharm
步骤:
- 使用Qt designer创建所有需要的对话框;
- 将其所有对话框都保存到指定目录下,并命名为MainDialog.ui 和SubDialog.ui;
- 使用Pycharm中的PyUIC工具(不知道的可自己到网上查找)将其MainDialog.ui 和SubDialog.ui转为MainDialog.py和SubDialog.py;并编译通过;
- 在Pycharm中新建一个Python File,命名为MyDialogCall.py,在文件中添加如下代码实现调用功能:
from PyQt5.QtWidgets import *
import sys
from MyMainDialog import Ui_Dialog
from mySubDialog import Ui_Dialog2
class SubDialog(QDialog,Ui_Dialog2):
def __init__(self):
super(SubDialog,self).__init__()
self.setupUi2(self)
self.setWindowTitle("自定义消息对话框:登录窗口")
class MainDialog(QDialog,Ui_Dialog):
def __init__(self):
super(MessageDialog,self).__init__()
self.setupUi(self)
self.setWindowTitle("消息对话框实验")
self.pushButton.clicked.connect(self.slotcalldialog)
def slotcalldialog(self): #调用其他自定义消息框
self.newDialog=SubDialog()
self.newDialog.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainDialog()
main.show()
sys.exit(app.exec_())
【图说明】
1)主对话框定义为消息框,其中一个按钮Other Infor可调用自定义对话框,(各位可创建一个简单的窗口就一个按钮即可),
2)在第3步中,MainDialog.py和SubDialog.py两个文件中的类名都一样,都是如下形式:
class Ui_Dialog(object):
def setupUi(self, Dialog):
.......................
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
为了在MyDialogCall.py文件中引用时不产生歧义,将子窗口文件SubDialog.py对应的类名改为
from MyMainDialog import Ui_Dialog
from mySubDialog import Ui_Dialog2
class Ui_Dialog2(object):
def setupUi2(self, Dialog):
.......................
self.retranslateUi2(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi2(self, Dialog):