• pyqt5 学习笔记八 (窗口、信号与槽)


    pyqt5 学习笔记八 (窗口、信号与槽)

    写在前面:
    ①本教程使用pycharm编译器进行pyqt5的学习,安装教程请大家自行百度
    ②本系列博客根据B站王铭东博主教程学习 学习代码 笔记8
    链接:https://pan.baidu.com/s/1i3y4mI_9N84iAC6tav-j8Q
    提取码:gupx
    资料:
    【1】B站教程
    【2】B站教程配套课件
    【3】PyQt官网的所有模块 (有部分内容没有补充进去)
    【4】C++具体实现的API文档

    (一)窗口

    窗口有三种:QWidget、QMainWindow、QDialog
    QMainWindow 是QWidget子类,继承QWidget,另外包含菜单栏、状态栏等
    详情参考:https://doc.itprojects.cn/0001.zhishi/python.0008.pyqt5rumen/index.html#/05.window

    (二)信号与槽 对象.信号.connect(槽函数)

    1、快捷键 alt+enter

    快捷键 alt+enter:当有的函数没有导入需要的包时,下方有红色波浪线
    在这里插入图片描述
    鼠标放在红色波浪线的位置按住alt+enter,就会出现下面这个界面,再按enter就会自动导入需要的包了
    在这里插入图片描述

    2、简单demo

    btn_press1.clicked.connect(self.btn_press1_clicked) 按钮和事件进行绑定
    信号:clicked 槽:btn_press1_clicked函数
    代码1:

    import sys
    from PyQt5.QtWidgets import QWidget,QApplication,QPushButton
    def pressbtn():
        print("点击按钮啦~")
    app = QApplication(sys.argv)
    w = QWidget()
    btn = QPushButton("点我点我", w)
    btn.clicked.connect(pressbtn)
    w.show()
    app.exec()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    代码2:

    import sys
    from PyQt5.QtWidgets import QWidget,QApplication,QPushButton
    class MyWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.initui()
        def initui(self):
            self.setWindowTitle("信号与槽")
            self.resize(300,300)
            btn = QPushButton("点我点我", self)  # 给按钮设置父亲,self
            # btn.setGeometry(200, 200, 100, 30)
            btn.clicked.connect(self.pressbtn)
        def pressbtn(self,arg):
            print("点击按钮啦~",arg)
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = MyWindow()
        w.show()
        app.exec()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    3、自定义信号

    from PyQt5.QtCore import pyqtSignal
    my_signal = pyqtSignal(str): 声明一个信号,这个信号只接收带有一个字符串的信号 只能写在函数外面
    self.my_signal.connect(self.sort_fall): 自己新建的信号与槽函数进行绑定
    对象.信号.发射(参数)
    self.my_signal.emit(msg+"【发现漏洞】"):触发自定义信号,相当于调用sort_fall函数
    def sort_fall(self,msg): print(">>>>>" + msg)

    import sys
    import time
    
    from PyQt5.QtCore import pyqtSignal
    from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
    class MyWindow(QWidget):
        # 声明一个信号,只能写在函数外面
        my_signal = pyqtSignal(str)
        def __init__(self):
            super().__init__()
            self.initui()
        def initui(self):
            self.resize(300,300)
            btn = QPushButton("测试",self)
            btn.setGeometry(100,200,100,50)
            btn.clicked.connect(self.pressbtn)
            self.my_signal.connect(self.sort_fall)  # 自己新建的信号与槽函数进行绑定
        def sort_fall(self,msg):
            print(">>>>>" + msg)
        def pressbtn(self):
            for num, ip in enumerate(["192.168.%s" % x for x in range(1,256)]):
                msg = "模拟,正在检查" + ip + "上的漏洞"
                print(msg)
                # 每5次报一次故障
                if num % 5 == 0:
                    # 这个时候触发自定义信号,相当于调用sort_fall函数
                    self.my_signal.emit(msg+"【发现漏洞】")
                print(msg)
            time.sleep(0.01)
    
    if __name__=='__main__':
        app = QApplication(sys.argv)
        w = MyWindow()
        w.show()
        app.exec()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    for num, ip in enumerate(["192.168.%s" % x for x in range(1,256)]):对元组进行拆包 num、ip
    num为从0到254,ip为192.168.1.1~192.168.1.255
    运行结果:
    在这里插入图片描述

    在这里插入图片描述

    4、复杂案例

    视频教程:https://www.bilibili.com/video/BV1LT4y1e72X?p=20&vd_source=7bf7a381cd41ba8ac1e32306d989aeb1
    在这里插入图片描述

    import sys
    import time
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    class MyWindow(QWidget):
        # 声明一个信号 只能放在函数的外面
        my_signal = pyqtSignal(str)
        def __init__(self):
            super().__init__()
            self.init_ui()
            self.msg_history = list()  # 用来存放消息
        def init_ui(self):
            self.resize(500, 200)
            # 创建一个整体布局器
            container = QVBoxLayout()
            # 用来显示检测到漏洞的信息
            self.msg = QLabel("")
            self.msg.resize(440, 15)
            # print(self.msg.frameSize())
            self.msg.setWordWrap(True)  # 自动换行
            self.msg.setAlignment(Qt.AlignTop)  # 靠上
            # self.msg.setStyleSheet("background-color: yellow; color: black;")
            # 创建一个滚动对象
            scroll = QScrollArea()
            scroll.setWidget(self.msg)
            # 创建垂直布局器,用来添加自动滚动条
            v_layout = QVBoxLayout()
            v_layout.addWidget(scroll)
            # 创建水平布局器
            h_layout = QHBoxLayout()
            btn = QPushButton("开始检测", self)
            # 绑定按钮的点击,点击按钮则开始检测
            btn.clicked.connect(self.check)
            h_layout.addStretch(1)  # 伸缩器
            h_layout.addWidget(btn)
            h_layout.addStretch(1)
            # 操作将要显示的控件以及子布局器添加到container
            container.addLayout(v_layout)
            container.addLayout(h_layout)
            # 设置布局器
            self.setLayout(container)
            # 绑定信号和槽
            self.my_signal.connect(self.my_slot)
        def my_slot(self, msg):
            # 更新内容
            print(msg)
            self.msg_history.append(msg)
            self.msg.setText("
    "
    .join(self.msg_history)) self.msg.resize(440, self.msg.frameSize().height() + 15) self.msg.repaint() # 更新内容,如果不更新可能没有显示新内容 def check(self): for i, ip in enumerate(["192.168.1.%d" % x for x in range(1, 255)]): msg = "模拟,正在检查 %s 上的漏洞...." % ip # print(msg) if i % 5 == 3: # 表示发射信号 对象.信号.发射(参数) self.my_signal.emit(msg + "【发现漏洞】") time.sleep(0.01) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWindow() w.show() app.exec()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    Selenium4.0 + Python手撸自动化框架系列之 Web截图 与 封装
    Python人工智能气象、大气污染扩散Calpuff模型、WRF/Chem模式、未来大气污染变化模拟
    ubuntu增加内存
    发如雪SQL Based on practice(二)
    猿创征文|瑞吉外卖——管理端_(菜品)分类管理
    web端动效 lottie-web 使用
    OpenGL ES glad 下载和使用
    Vue3从入门到精通(一)
    基于微信小程序的校园跑腿系统的研究与实现,附源码
    torch.distributed.launch 指定端口rdzv_endpoint
  • 原文地址:https://blog.csdn.net/weixin_40581859/article/details/126285116