前言
欢迎来到我的博客
个人主页:北岭敲键盘的荒漠猫-CSDN博客
本文主要整理pyside进行多窗口的制作
主要方法
制作多窗口主要得益于以下几个关键函数。
函数 | 方法 |
show() | 打开窗口 |
close() | 关闭窗口(再打开后出现在默认位置) |
hide() | 隐藏窗口(再打开的时候在隐藏时的位置) |
代码案例
代码演示:
#引入窗口的基本库
from PySide6.QtWidgets import QApplication,QWidget
#引入我们的文件(win是我们生成的py文件)
from win import Ui_Form
from subwin import Ui_Form as Ui2
#定义窗口类
class Mainwindow(QWidget,Ui_Form):
def __init__(self): #继承窗口和win文件中的Ui_From类
super().__init__()
self.setupUi(self)#导入UI文件
self.subwin=Subwin()
self.pushButton_3.clicked.connect(self.bindShow)
self.Close.clicked.connect(self.bindClose)
self.Hide.clicked.connect(self.bindHide)
def bindShow(self):
self.subwin.show()
def bindClose(self):
self.subwin.close()
def bindHide(self):
self.subwin.hide()
class Subwin(QWidget,Ui2):
def __init__(self):
super().__init__()
self.setupUi(self)
def showit(self):
self.show()
def closeit(self):
self.close()
def hideit(self):
self.hide()
if __name__=="__main__":
app=QApplication([])#开启,传参
windows=Mainwindow()#实例化对象
windows.show()#显示窗口
app.exec()#循环监听
效果演示:
上述代码利弊
上述代码比较简洁的直接在主窗口中定义了一个子窗口的对象。
但是这个有个问题。
我们如果主窗口跟子窗口都需要互相通信的话,主窗口实例化子窗口,子窗口实例化主窗口。
这样主窗口实例子窗口的时候,子窗口的代码又会实例化主窗口,主窗口又会执行实例化子窗口的代码。子子孙孙无穷尽也。
这时候就需要用一些特殊的方法来实现主窗口与子窗口之间的相互通信。
主子窗口的相互方法调用
首先导入这个库
from PySide6.QtCore import Signal
子窗口设置一个信号
sendValueToMain=Signal(str)
之后再__init__中设置一个父窗口的参数传递进入,并且实例化
def __init__(self,parent=None):
super().__init__()
self.parent=parent
最后修改一下父窗口实例化子窗口的代码,把自己作为父窗口的参数传到里面。
self.subwin=Subwin(self)
最终代码如下
#引入窗口的基本库
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtCore import Signal
#引入我们的文件(win是我们生成的py文件)
from win import Ui_Form
from subwin import Ui_Form as Ui2
#定义窗口类
class Mainwindow(QWidget,Ui_Form):
def __init__(self): #继承窗口和win文件中的Ui_From类
super().__init__()
self.setupUi(self)#导入UI文件
self.subwin=Subwin(self)
self.pushButton_3.clicked.connect(self.bindShow)
self.Close.clicked.connect(self.bindClose)
self.Hide.clicked.connect(self.bindHide)
def bindShow(self):
self.subwin.show()
def bindClose(self):
self.subwin.close()
def bindHide(self):
self.subwin.hide()
class Subwin(QWidget,Ui2):
sendValueToMain=Signal(str)
def __init__(self,parent=None):
super().__init__()
self.parent=parent
self.setupUi(self)
self.pushButton.clicked.connect(self.botton)
def showit(self):
self.show()
def closeit(self):
self.close()
def hideit(self):
self.hide()
def botton(self):
self.parent.textEdit.setText("主窗口成功的接收到了子窗口的信号")
if __name__=="__main__":
app=QApplication([])#开启,传参
windows=Mainwindow()#实例化对象
windows.show()#显示窗口
app.exec()#循环监听
这样就能实现父子窗口之间的通信了。
父子窗口的信号传递
上面那个方法主要是我们用来相互调用方法,但我们想要做另一个功能。
我们在子窗口也添加一个文本框,我们把子窗口的文本框的内容传递给主窗口的文本框。
这样的话我们该怎么操作。
绑定信号
我们已经创建了信号
现在绑定好父窗口的相关控件,然后按钮绑定自己的控件
这样我们一点按钮,他就会激活这个信号,给上面绑定的方法传入我们的参数
def botton_bind(self):
self.sendValueToMain.connect(self.parent.textEdit.setText)
self.pushButton.clicked.connect(self.send_info)
def send_info(self):
print("run")
self.sendValueToMain.emit(self.textEdit.toPlainText())