主界面调用子窗体在delphi、c#等语言的窗体调用很简单,只需在主窗体中引用子窗体的名称就可以把子窗体show出来,开发起来很方面,但是在pyqt5中子窗体的调用就显得相对复杂,而且网上的方法各不相同使人眼花缭乱,大部分的都没有参考性,近期本人在开发小工具的过程中走了一些弯路,因此把自己调用的方法写出来给大家分享。
首先,本人的框架是逻辑和界面分离的,主体代码如下:
运行代码:
Run.py
import sys
from PyQt5.QtWidgets import QApplication
from logic_code import MainWindow
if __name__=='__main__':
app=QApplication(sys.argv)
MainWindow=MainWindow()
MainWindow.show()
sys.exit(app.exec_())
逻辑代码:
逻辑代码:
Logic.py
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from Ui_mianfrom import Ui_MainWindow
from Ui_childform import Ui_set_form
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): #主窗体在逻辑文件中的类的代码
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.set_btn.clicked.connect(self.opensetWindow)#按钮双击的槽函数
self.set_window = SetWindow() #调用新窗体时需要在调用的窗体下先给被调用的窗体实例化,否则,在函数中实例化会导致被调用的窗体没有窗体头部!!!
def opensetWindow(self): #调用设置窗体
self.set_window.setGeometry(100,100,1000,600)
self.set_window.show()
class SetWindow(QtWidgets.QWidget,Ui_set_form): #子窗体在逻辑文件中的类的代码
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
以上就是逻辑窗体中调用新窗体的方法,要注意的是class SetWindow(QtWidgets.QWidget,Ui_set_form)中的Ui_set_form是子窗体中的“class Ui_set_form(object):,也就是子窗体中的类名,在逻辑窗体中我们可以定义一个新类SetWindow让这个新类继承QtWidgets.QWidget并通过setupUi
方法按照Ui_set_form来设置窗口的布局和子部件来布局,并通过setupUi
方法来实现。主窗体在调用子窗体的时候,要在调用方法之外对子窗体进行实例化“self.set_window = SetWindow()”,否则会导致打开的子窗体失去窗体头部,与主窗体融在一起无法拖动。