pyside2 多窗口之间的继承与跳转

本实例环境ubuntu16+python3.5+PySide2==5.12

学习pyqt5两个月,一直不明白类初始化函数__init__(self, parent)中parent的作用,如果本窗口需要继承其他窗口, 这里的parent就应该填parent=继承的窗口类.

创建一个主窗口

'''该文件命名为mainWin.py'''

from PySide2.QtWidgets import QWidget, QCheckBox, QApplication, QPushButton, QLabel, QVBoxLayout, QFormLayout
import subFirst
import sys


class Example(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.initUI()
        self.setWindowTitle('主窗口')

    def initUI(self):
        self.cb = QCheckBox('复选框', self) #添加一个复选框
        self.cb.stateChanged.connect(self.changecb) #关联复选框槽函数
        self.bt = QPushButton('确定', self) #添加一个按钮
        self.bt.clicked.connect(self.go) #关联按钮槽函数
        self.label = QLabel() #添加一个标签
        self.formlayout = QFormLayout()
        self.formlayout.addRow(self.cb, self.label)
        self.vbox = QVBoxLayout()
        self.vbox.addLayout(self.formlayout)
        self.vbox.addWidget(self.bt)
        self.setLayout(self.vbox)
        self.resize(400, 300)
        self.show()

    def go(self): #按钮槽函数
        if self.cb.isChecked():
            subFirstWindow = subFirst.firstSub(self) #打开第一个子窗口
            subFirstWindow.show()
        else:
            pass

    def changecb(self): #复选框槽函数
        if self.cb.isChecked():
            self.label.setText('单选框已被勾选,点击确定跳转到子窗口')
        else:
            self.label.setText(' ')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

创建第一个子窗口

'''该文件命名为subFirst.py'''

import sys
import subSecond, mainWin
from PySide2.QtWidgets import QDialog, QVBoxLayout, QPushButton, QTextEdit, QLabel, QFormLayout, QApplication


class firstSub(QDialog):

    def __init__(self, parent=None): #parent参数默认为None
        QDialog.__init__(self, parent) #传入parent参数,想要继承那个窗口,parent就填谁
        self.initUi()
        self.setWindowTitle('窗口1')

    def initUi(self):
        btn = QPushButton('跳到第二个子窗口')
        btn.clicked.connect(self.btnfunc)
        label = QLabel()
        textEdit = QTextEdit()
        formlayout = QFormLayout()
        vbox = QVBoxLayout()
        label.setText('表格')
        formlayout.addRow(label, textEdit)
        vbox.addLayout(formlayout)
        vbox.addWidget(btn)
        self.setLayout(vbox)
        self.show()

    def btnfunc(self):
        sub2 = subSecond.secondSub(self) #跳到第二个子窗口, self指向本类,所以secondSub继承本窗口,即继承firstSub
        sub2.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    sub1 = firstSub()
    sys.exit(app.exec_())

创建第二个子窗口

'''该文件命名为subSecond.py'''

from PySide2.QtWidgets import QLabel, QHBoxLayout, QApplication, QDialog, QPushButton
import sys
import subThird

class secondSub(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.initUi()

    def initUi(self):
        self.setWindowTitle('窗口2')
        btn = QPushButton('跳到第三个子窗口')
        btn.clicked.connect(self.btnfunc)
        hbox = QHBoxLayout()
        hbox.addWidget(btn)
        self.setLayout(hbox)
        self.resize(200, 200)
        self.show()

    def btnfunc(self):
        sub3 = subThird.thirdSub(self)#跳到第三个子窗口, self指向本类,所以thirdSub继承本窗口,即继承secondSub
        sub3.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    sub2 = secondSub()
    sys.exit(app.exec_())


创建第三个子窗口

'''该文件命名为subThird.py'''

from PySide2.QtWidgets import QDialog, QLineEdit, QVBoxLayout, QApplication
import sys


class thirdSub(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.initUi()

    def initUi(self):
        self.setWindowTitle('窗口3')
        lineEdit = QLineEdit()
        lineEdit.setText('第三个子窗口')
        vbox = QVBoxLayout()
        vbox.addWidget(lineEdit)
        self.setLayout(vbox)
        self.resize(200, 100)
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    sub3 = thirdSub()
    sys.exit(app.exec_())

 

PySide2是一个用于创建跨平台图形用户界面Python库。在使用PySide2进行多线程编程时,可以通过创建新线程、子线程发射信号到主界面来实现多线程操作。\[1\] 在示例代码中,首先导入了必要的模块,包括QApplication、QTextBrowser、QUiLoader、Thread和Signal等。然后定义了一个自定义的信号源对象类型MySignals,该对象继承自QObject,并定义了两种信号类型。接着实例化了一个MySignals对象global_ms,并在Stats类的构造函数中将自定义信号的处理函数与信号连接起来。\[2\] 在task1和task2函数中,通过创建新线程并在其中调用threadFunc函数来实现多线程操作。在threadFunc函数中,通过emit方法触发执行主线程中的处理函数,从而实现子线程发射信号到主界面的功能。\[2\] 除了使用Thread模块,还可以使用QThread类来实现多线程操作。可以简单修改线程类的定义,重写run方法,并在主线程中创建QThread对象来启动线程。需要注意的是,线程不能被垃圾回收,可以通过增加self引用来防止线程对象被垃圾回收。\[3\] 总结来说,PySide2可以通过创建新线程、子线程发射信号到主界面来实现多线程操作。可以使用Thread模块或QThread类来创建线程,并通过信号与槽机制来实现线程间的通信。 #### 引用[.reference_title] - *1* [PySide2多线程问题示例:创建新线程、子线程发射信号到主界面](https://blog.csdn.net/xhzc7/article/details/116702475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PYQT5|Pyside2 后台线程 与 信号方式多线程防止界面卡死](https://blog.csdn.net/zh6526157/article/details/121797339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PySide2----多线程](https://blog.csdn.net/weixin_45228198/article/details/128439449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值