pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

时间:2023-03-09 01:29:55
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮。并转换成mainWindow.py

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'f.ui'
#
# Created by: PyQt5 UI code generator 5.9
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(80, 90, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))

2. 用qt designer编写子窗体,窗体类型是Dialog, 空白窗口上一个按钮。并转换成childWindow.py

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(160, 100, 75, 23))
self.pushButton.setObjectName("pushButton")
Dialog.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) #设置窗体总显示在最上面
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "PushButton"))

3,编写调用程序,这个重点,

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog
from dust.mainWindow import *
from dust.childWindow import * if __name__ == '__main__':
app = QApplication(sys.argv)
#实例化主窗口
main = QMainWindow()
main_ui = Ui_MainWindow()
main_ui.setupUi(main )
#实例化子窗口
child = QDialog()
child_ui = Ui_Dialog()
child_ui.setupUi(child) #按钮绑定事件
btn = main_ui.pushButton
btn.clicked.connect( child.show ) #显示
main.show()
sys.exit(app.exec_())

4. 上面的程序只是能显示了,要想添加自定义事件,还不行,加自定义事件,有一个办法是再封装一个类,主窗体和子窗体都如此。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog
from dust.mainWindow import *
from dust.childWindow import * #mainWindow
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MyMainWindow,self).__init__()
self.setupUi(self) self.setGeometry(0, 0, 1024, 600)
self.setWindowTitle('main window') def paintEvent(self, event):
painter = QPainter(self)
pixmap = QPixmap("./image/bg.jpg")
painter.drawPixmap(self.rect(),pixmap) def keyPressEvent(self, e): if e.key() == Qt.Key_Escape:
self.close() class ChildWindow(QDialog, Ui_Dialog):
def __init__(self):
super(ChildWindow,self).__init__()
self.setupUi(self) self.setWindowTitle('child window') self.pushButton.clicked.connect( self.btnClick) #按钮事件绑定 def btnClick(self): #子窗体自定义事件
self.close() if __name__ == '__main__':
app = QApplication(sys.argv) main = MyMainWindow() child = ChildWindow() btn = main.pushButton #主窗体按钮事件绑定
btn.clicked.connect( child.show ) main.show()
sys.exit(app.exec_())