前言:
正在学习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):
pass
def 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 QtWidgets
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()
class controller:
def __init__(self):
pass
def 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_()
效果: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++也并不怎么需要把传递的参数写出来呢?
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧