pyqt5的页面跳转-创新互联

前言:
正在学习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_()
效果:

1
2
3
4
5

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)

页面如图
19
我就想跳转到另一个页面专门展示我爬到的
后面上网查的时候才发现,原来参数是隐含着的,不必明显写出来

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这个信号是绑定好了的
44
所以在c++里要加参数的时候,这里可以不加
111
那么转念一想,我在C++上用QT的时候遇到这种要传参数的槽函数绑定时,我总是束手无策,所以直接将参数转变为对象的一个成员变量了,是否QTc++也并不怎么需要把传递的参数写出来呢?

效果

131

222

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:pyqt5的页面跳转-创新互联
文章网址:http://myzitong.com/article/shcpj.html