Pyqt5部分学习笔记1——信号和槽机制

Pyqt5部分学习笔记

1.信号和槽机制

一类是控件自带的常用信号,clicked,changed等等,不展开写,可根据需求在ide中自己找到这些事件的信号。

另一类是自定义信号,这部分比较关键,他是不同pyqt5子线程与主线程之间通信的主要方式,因为所有内部函数在子线程处理后返回的结果,需要通过发射信号来触发Gui界面控件的变化或输出。

在实际开发中,我们会用到不同的信号,也会需要触发不同控件的输出,这时候定义一个专门的pyqtSignal信号类,在类中定义多个信号,只需要在运行时实例化这个信号对象就可以创建所有的信号子类,方便后续添加信号和调用信号。

# 自定义信号源对象类型,一定要继承自 QObject
class MySignals(QObject):

    # 定义一种信号,两个参数 类型分别是: QTextBrowser 和 字符串
    # 调用 emit方法 发信号时,传入参数 必须是这里指定的 参数类型
    text_browser_print = pyqtSignal(QTextBrowser, str)
    text_lineedit_print = pyqtSignal(QLineEdit, str)

    # 还可以定义其他种类的信号
    update_table = Signal(str)



class MaiWin:

    def __init__(self):
        self.ms = MySignal()

        # 自定义信号的处理函数
        global_ms.text_print.connect(self.printToGui)


....

    def printToGui(self, fb, text):
        fb.append(str(text))
        fb.ensureCursorVisible()

    def task1(self):
        def threadFunc():
            # 通过Signal 的 emit 触发执行 主线程里面的处理函数
            # emit参数和定义Signal的数量、类型必须一致
            global_ms.text_print.emit(self.ui.infoBox1, '输出内容')
        
        thread = Thread(target = threadFunc )
        thread.start()

    def task2(self):
        def threadFunc():
            global_ms.text_print.emit(self.ui.infoBox2, '输出内容')

        thread = Thread(target=threadFunc)
        thread.start()

2.QtDesigner

使用QtDesigner绘制的布局xml文件,即后缀为*.ui文件,有两种方式加载到python里面。

第一个,通过loadUi方法,动态加载ui文件,loadUi返回的对象可以直接调用控件等。

from PyQt5.uic import loadUi

class mainWin:

    def __init__(self):
        # 从文件中加载UI定义

        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = loadUi('main.ui')

        self.ui.button.clicked.connect(self.handleCalc)

第二个,通过pyUic将xml格式为ui布局文件转换为py文件,所生成的py文件就是一个用来创建和加载控件布局的类方法,该类中的setupUi方法,需要传入窗体对象,调用后立即创建相关布局。

 


版权声明:本文为qq_31761067原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。