前言:
正在学习python,学到了文件读取操作,想用pyqt5实现一下,发现我对于pyqt5还是不够了解。
现在记录一下我用pyqt5实现页面跳转的过程
方便以后查阅
pycharm使用pyqt5的话建议解释器用python3.7
由于目前我的水平还是太菜,所以我搞的这个也不太高级吧。。。
我的做法:
首先要在每个要页面类下面加一行
switch_win = QtCore.pyqtSignal()
这个好像是什么跳转信号来着
加了以后再往类里面加一个函数(函数名随便)
def tobtn3(self):self.switch_win3.emit()
我代码中的其中一个类如下
class win2(QWidget):switch_win3 = QtCore.pyqtSignal()def __init__(self):super().__init__()self.ui = uic.loadUi("./win2.ui")self.ui.pushButton.clicked.connect(self.write1)self.ui.pushButton_3.clicked.connect(self.tobtn3)# 上面这个就是把那个按钮和跳转函数绑定def write1(self):text = self.ui.textEdit.toPlainText()fp = open("./test.txt", 'a')fp.write(text)fp.write("\n")self.ui.textEdit.clear()fp.close()def tobtn3(self):self.switch_win3.emit()
由于我太菜,有些不懂一些东西,所以只好在main文件里整几个类了
如以下:
class win1(QWidget):switch_win2 = QtCore.pyqtSignal()def __init__(self):super().__init__()self.ui = uic.loadUi("./win1.ui")self.ui.pushButton.clicked.connect(self.todobtn1)def todobtn1(self):self.switch_win2.emit()self.ui.close()class win2(QWidget):switch_win3 = QtCore.pyqtSignal()def __init__(self):super().__init__()self.ui = uic.loadUi("./win2.ui")self.ui.pushButton.clicked.connect(self.write1)self.ui.pushButton_3.clicked.connect(self.tobtn3)def write1(self):text = self.ui.textEdit.toPlainText()fp = open("./test.txt", 'a')fp.write(text)fp.write("\n")self.ui.textEdit.clear()fp.close()def tobtn3(self):self.switch_win3.emit()class win3(QWidget):def __init__(self):super().__init__()self.ui = uic.loadUi("./win3.ui")self.read1()def read1(self):fp = open("./test.txt", 'r')for line in fp:self.ui.textBrowser.append(line)fp.close()
在这里的话,我查阅到的方法是单独弄个controller
当然这个我也不是很懂,如下(后面有具体讲解):
class controller:def __init__(self):passdef show_win1(self):self.win1 = win1()self.win1.switch_win2.connect(self.show_win2)self.win1.ui.show()def show_win2(self):self.win2 = win2()self.win2.switch_win3.connect(self.show_win3)self.win2.ui.show()def show_win3(self):self.win3 = win3()self.win3.ui.show()
通过使用可以得知,页面跳转的跳转操作其实是在controller类里面进行的
比如这一句,就是把win2类里面的switch_win3这个跳转信号与controller里面的show_win3()函数连接
self.win2.switch_win3.connect(self.show_win3)
主函数就这样:
if __name__ == '__main__':app = QApplication(sys.argv)w = controller()w.show_win1()app.exec_()
总的代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic, QtCore
from PyQt5 import QtWidgetsclass win1(QWidget):switch_win2 = QtCore.pyqtSignal()def __init__(self):super().__init__()self.ui = uic.loadUi("./win1.ui")self.ui.pushButton.clicked.connect(self.todobtn1)def todobtn1(self):self.switch_win2.emit()self.ui.close()class win2(QWidget):switch_win3 = QtCore.pyqtSignal()def __init__(self):super().__init__()self.ui = uic.loadUi("./win2.ui")self.ui.pushButton.clicked.connect(self.write1)self.ui.pushButton_3.clicked.connect(self.tobtn3)def write1(self):text = self.ui.textEdit.toPlainText()fp = open("./test.txt", 'a')fp.write(text)fp.write("\n")self.ui.textEdit.clear()fp.close()def tobtn3(self):self.switch_win3.emit()class win3(QWidget):def __init__(self):super().__init__()self.ui = uic.loadUi("./win3.ui")self.read1()def read1(self):fp = open("./test.txt", 'r')for line in fp:self.ui.textBrowser.append(line)fp.close()class controller:def __init__(self):passdef show_win1(self):self.win1 = win1()self.win1.switch_win2.connect(self.show_win2)self.win1.ui.show()def show_win2(self):self.win2 = win2()self.win2.switch_win3.connect(self.show_win3)self.win2.ui.show()def show_win3(self):self.win3 = win3()self.win3.ui.show()if __name__ == '__main__':app = QApplication(sys.argv)w = controller()w.show_win1()app.exec_()
效果:





pyqtSignal 传递参数
12月4日17点添加
由于python和我平时用的c++中有些地方不同,而我还是用c++的思想来找传递参数怎么用,就没找到合适的了。
最后发现emmm
先如下所示,这是我写的一个类,主要就是输入网址然后爬源码
class urlwin1(QWidget):switch_win31 = QtCore.pyqtSignal(str)def __init__(self):super().__init__()self.ui = uic.loadUi("./urlwin1.ui")self.ui.pushButton.clicked.connect(self.getCtrlU)def getCtrlU(self):text = self.ui.lineEdit.text()response = urllib.request.urlopen(text)data = response.read().decode('utf-8')self.switch_win31.emit(data)
页面如图

我就想跳转到另一个页面专门展示我爬到的
后面上网查的时候才发现,原来参数是隐含着的,不必明显写出来
class controller:def show_urlwin1(self):self.urlwin1 = urlwin1()self.urlwin1.switch_win31.connect(self.show_win31)self.urlwin1.ui.show()def show_win31(self, data):self.win3 = win3()self.win3.ui.textBrowser.append(data)self.win3.ui.show()
在类里面,data和switch_win31这个信号是绑定好了的

所以在c++里要加参数的时候,这里可以不加

那么转念一想,我在C++上用QT的时候遇到这种要传参数的槽函数绑定时,我总是束手无策,所以直接将参数转变为对象的一个成员变量了,是否QTc++也并不怎么需要把传递的参数写出来呢?
效果












![Go语言WEB开发[html/template包]](https://img-blog.csdnimg.cn/c1edb049bfd841c09cffb0006a02bef0.png)





