zoukankan      html  css  js  c++  java
  • pyqt笔记1模块 信号和插槽

    资料

    1. PyQt5图形界面编程
    2. PyQt5指南

    模块

    PyQt5本身拥有超过620个类和6000函数及方法。

    1. QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time、文件、目录、数据类型、文本流、链接、mime、线程或进程等对象。
    2. QtWidgets模块包含了一整套UI元素组件,用于建立符合系统风格的classic界面。
    3. QtGui模块涵盖多种基本图形功能的类; 包括但不限于:窗口集、事件处理、2D图形、基本的图像和界面 和字体文本。

    信号和插槽

    信号和槽是用来在对象间传递数据的方法:当一个特定事件发生的时候,signal会被发射出来,和信号连接的slot会被调用。连接信号和槽的语法为SenderObject.signal.connect(ReceiverObject.Slot)
    很多GUI编程使用的是回调机制,而PyQt5具有独特的信号和插槽机制来处理事件。。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输,信号发出的参数个数一定要大于槽函数接收的参数个数。

    特点

    1. 一个信号可以连接多个槽。
    2. 一个信号可以连接另一个信号。
    3. 信号参数可以是任何Python类型。
    4. 一个槽可以监听多个信号。
    5. 信号与槽的连接方式可以是同步连接,也可以是异步连接。
    6. 信号与槽的连接可能会跨线程。
    7. 信号可能会断开。

    定义新的信号:使用pyqtSignal()方法,新的信号作为类的属性。

    #示例
    class MyWidget(QWidget):   
        #定义信号
        Signal1 = pyqtSignal() # 无参数的信号      
        Signal2 = pyqtSignal(int) # 带一个参数(整数)的信号 
        Signal3= pyqtSignal(int,str)  # 带两个参数(整数,字符串)的信号         
    
        def __init__(self,parent=None):
            super(CustSignal,self).__init__(parent)
    
            #将信号连接到指定槽函数
            self.Signal1.connect(self.signalCall1)
            self.Signal2.connect(self.signalCall2)
            self.Signal3.connect(self.signalCall3)
        
    
          
        #实现槽函数
        def signalCall1(self):
            print("signal1 emit")
    
        def signalCall2(self,val):
            print("signal2 emit,value:",val)
    
        def signalCall3(self,val,text):
            print("signal3 emit,value:",val,text)
    
        def mousePressEvent(self, e):
            #重写点击事件 发射信号
            self.Signal1.emit()
            self.Signal2.emit(1)
            self.Signal3.emit(1,"text")
     
    

    给槽函数传递数据

    sender()方法确定信号源https://zhuanlan.zhihu.com/p/28415799

    #在槽中
    def buttonclicked(self):
            computer = randint(1,3)
            player = 0
            sender = self.sender()
            if sender.text() == '剪刀':
                player = 1
            elif sender.text() == '石头':
                player = 2
            else:
                player = 3
    

    自定义参数的传递:使用lambda表达式https://blog.csdn.net/broadview2006/article/details/80132757

            button1.clicked.connect(lambda: self.onButtonClick(1)) 
            button2.clicked.connect(lambda: self.onButtonClick(2))
    
  • 相关阅读:
    在Visual Studio 2015中引用DLL的3种方法
    在Qt中使用大漠插件
    wprintf、wcout无法输出中文的解决方案
    在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案
    使用Java绘制验证码
    adb常用命令整理
    Java中数组复制的几种方式以及数组合并
    在Qt Creator中为Qt工程添加资源
    使用POCO发送HTTP(S)请求
    使用Qt发送HTTPS请求
  • 原文地址:https://www.cnblogs.com/uestcman/p/9816968.html
Copyright © 2011-2022 走看看