精华内容
下载资源
问答
  • 其用法比较灵活,特别适合用于多页面之间的信号,信息传递,其继承之QtCore类。 基本用法: 信号传递方法:可以传递的信息,可以说是基本上覆盖了Python的所有数据类型。 pyqtSignal(str) # 传递字符串数据 ...

    PyQt pyqtSignal 自定义信号实例讲解,多页面信息传递

    个人认为pyqtSignal是pyqt里非常实用的一个接口,是 PyQt5 提供的自定义信号类; 其用法比较灵活,特别适合用于多页面之间的信号,信息传递,其继承自QtCore类。

    基本用法:
    信号传递方法:可以传递的信息,可以说是基本上覆盖了Python的所有数据类型。

    pyqtSignal(str)  # 传递字符串数据
    pyqtSignal(list)  # 传递列表数据
    pyqtSignal(tuple)  # 传递元祖数据
    pyqtSignal(dict)  # 传递字典数据
    

    其用法可归纳为:

    1、定义信号 diy_signal = pyqtSignal(str);
    2、信号激发:diy_signal.emit(需传递的数据);
    3、接收信号:diy_signal.connect(激发的槽函数)。

    可以看出pyqtSignal和pyqt的信号与槽用法非常类似。
    都有信号的激发,信号与槽函数的链接过程。如:QPushButton().clicked.connect(click_func)。
    只不过其信号相对于按钮的点击而言,为自定义信号。

    实例用法:
    我们先来试着用pyqtsignal信号来完成以下的需求:
    有两个父子页面,当子页面被创建和关闭时,父页面显示子页面状态信息。
    完成最终效果:
    完成效果

    先创建父页面类:

    #  导入模块
    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import Qt,pyqtSignal
    from PyQt5.QtGui import QFont
    
    # 创建父页面类
    class Parents_Widget(QWidget):
        def __init__(self):
            super(Parents_Widget, self).__init__()
            # 页面基础设置
            # 设置窗口标题
            self.setWindowTitle('父页面')
            # 设置页面尺寸
            self.resize(500,200)
            # 创建Label控件
            # 页面标题label
            self.label_0 = QLabel('页面间信号传递实例')
            # 设置label控件居中
            self.label_0.setAlignment(Qt.AlignCenter)
            # 设置字体样式
            self.label_0.setFont(QFont('宋体',12,QFont.Bold))
            self.label_1 = QLabel('子页面状态:')
            # 创建单行文本输入框
            self.line_1 = QLineEdit()
            # 创建按钮
            self.create_button = QPushButton('创建子页面')
            self.close_button = QPushButton('关闭子页面')
            # 按钮初始方法
            self.button_init()
            # 创建布局管理器
            self.h1_layout = QHBoxLayout()  # 水平布局管理器
            self.h2_layout = QHBoxLayout()
            self.v_layout = QVBoxLayout()  # 垂直布局管理器
            # 页面初始化
            self.layout_init()
    
        # 页面布局方法
        def layout_init(self):
            # 水平布局管理器1
            self.h1_layout.addWidget(self.label_1)
            self.h1_layout.addWidget(self.line_1)
            # 水平布局管理器2
            self.h2_layout.addWidget(self.create_button)
            self.h2_layout.addWidget(self.close_button)
            # 垂直布局管理器
            self.v_layout.addStretch(1)
            self.v_layout.addWidget(self.label_0)
            self.v_layout.addSpacing(10)
            self.v_layout.addLayout(self.h1_layout)
            self.v_layout.addSpacing(10)
            self.v_layout.addLayout(self.h2_layout)
            self.v_layout.addStretch(1)
            # 设置最终布局
            self.setLayout(self.v_layout)
    
        # 按钮初始化方法
        def button_init(self):
            # 创建子页面按钮点击信号绑定槽函数
            self.create_button.clicked.connect(self.create_func)
            # 关闭子页面按钮点击信号绑定槽函数
            self.close_button.clicked.connect(self.close_func)
    
        # 创建子页面方法
        def create_func(self):
            # 创建子页面
            self.child_widget = Child_Widget()
            # 子页面自定义信号绑定显示子页面信息方法
            self.child_widget.status_signal.connect(
                self.child_widget_info)
            # 设置子页面名称
            self.child_widget.setWindowTitle('子页面')
            self.child_widget.show()
    
        # 子页面关闭方法
        def close_func(self):
            try:
                self.child_widget.close()
                self.child_widget.status_signal.connect(self.child_widget_info)
            except:
                self.line_1.setText('子页面不存在!')
    
        # 子页面信息显示方法
        def child_widget_info(self,info):
            if info == 'create':
                self.line_1.setText('子页面被创建')
            elif info == 'close':
                self.line_1.setText('子页面被关闭')
                
    

    代码分析:
    1、父页面有两个按钮:创建子页面按钮,关闭子页面按钮。
    2、两个按钮点击信号分别绑定创建页面槽函数,关闭子页面槽函数。
    3、创建子页面槽函数,创建了子页面,并将子页面的自定义信号status_signal绑定在子页面信息显示方法。当子页面自定义信号激发(emit)时激活子页面信息显示槽函数。
    4、关闭子页面槽函数,关闭子页面。

    创建子页面类:

    # 创建子页面类
    class Child_Widget(QWidget):
        # 创建自定义子页面状态信号
        status_signal = pyqtSignal(str)
        def __init__(self):
            super(Child_Widget, self).__init__()
            # 设定子页面尺寸
            self.resize(300,300)
            # 设定子页面的窗口名称改变信号与自定义信号连接
            self.windowTitleChanged.connect(lambda :
                        self.status_signal.emit('create'))
    
        # 重写关闭方法,将子页面关闭事件与自定义信号连接
        def closeEvent(self, event):
            self.status_signal.emit('close')
    

    代码分析:
    1、自定义信号:status_signal ,其传输的信息类型为字符串。
    2、子页面状态有创建和关闭两种状态,创建状态用子页面标题改变信号来绑定自定义信号。
    即:子页面标题从无到有时,自定义信号被激发(emit),并传递 ‘create’ 字符串信息。
    3、子页面关闭状态,这里是重写了页面关闭方法。让页面关闭事件绑定自定义信号,当页面关闭时激发信号,并传递 ‘close’ 字符串信号。

    实例父页面类,及展示窗口:

    if __name__ == '__main__':
        page = QApplication(sys.argv)
        # 实例父页面
        window = Parents_Widget()
        window.show()
        sys.exit(page.exec())
    

    结尾:
    以上就是本次 pyqt5 使用自定义信号 pyqtSignal 来进行页面之间的信息传递的方法及实例讲解。
    因本人Python 及 pyqt5 均为视频或者书籍自学,路子可能比较野…。
    有讲的不清楚,或者错误之处,欢迎大家留言讨论。也可加本人微信:dw20200318,索要源码,一起学习。

    展开全文
  • Electron的运行环境为Chromium + Node.js, 而Chromium采用的是进程机制,也就是说每个页面都是一个独立的进程(渲染进程),因此页面之间是没有直接关系的,要想进行通信,需要借助主进程作为桥梁。所以我们首先先来...

    Electron的运行环境为Chromium + Node.js, 而Chromium采用的是多进程机制,

    也就是说每个页面都是一个独立的进程(渲染进程),因此页面之间是没有直接关系的,

    要想进行通信,需要借助主进程作为桥梁。

    所以我们首先先来学习主进程和渲染进程怎么通信:

    1. 渲染进程---->主进程

    发送端:

    ipcRenderer.send(channel, data)

    接收端:

    ipcMain.on(channel, listener)

    2. 主进程---->渲染进程

    发送端:

    ① 被动发送

    在主进程通过ipcMain.on接收到渲染进程的消息时,可以通过listener函数的event参数得到发送者, 回复消息,

    event.sender.send(channel, data)

    ② 主动发送

    win(要发送给的渲染进程窗体对象变量).webContents.send(channel, data)

    接收端:

    ipcRenderer.on(channel, listener)

    有了以上背景知识,页面间通信就很简单了,页面1发送事件给主进程,主进程再发送事件给页面2即可。

    注:

    在Electron 5.x以后的版本,渲染进程默认没有启用Node.js环境,

    在创建窗体时需要指定启用Node环境,否则require命令在渲染进程中将不支持,无法导入electron中的ipcRenderer。

    let win = newBrowserWindow({webPreferences: {

    nodeIntegration:true}

    })

    展开全文
  • 如何实现浏览器内多个标签页之间通信 WebSocket、 SharedWorker ;也可以调用localstorage、 cookies 等本地存储方式; localstorage另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件,我们通过监听...

    如何实现浏览器内多个标签页之间的通信

    WebSocket、 SharedWorker ;也可以调用localstorage、 cookies 等本地存储方式;

    localstorage另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件,我们通过监听事件,控制它的值来进行页面信息通信;

    注意quirks: Safari 在无痕模式下设置 localstorge 值时会抛出 QuotaExceededError 的异常;

    展开全文
  • 学习更的前端知识,欢迎右上角关注一下问题:vue组件间如何进行通信?本章主要讲解的同一个页面index.vue下的不同组件间footer.vue和header.vue,header.vue里面又使用了headerLeft.vue组件通信的问题。例如:父子...

    学习更多的前端知识,欢迎右上角关注一下

    问题:vue组件间如何进行通信?

    本章主要讲解的同一个页面index.vue下的不同组件间footer.vue和header.vue,header.vue里面又使用了headerLeft.vue组件通信的问题。

    例如:父子组件通信index.vue与header.vue、同级组件通信header.vue与footer.vue、父孙组件通信index.vue与headerLeft.vue。

    351ab8d55ba10857f115830842ed167b.png

    对于这个问题的一般回答:

    在项目中采用bus中央事件总线的方法。

    对于这个问题的详细解答

    组件间数据相互传递:

    1. 可以通过props子组件中传值
    2. 可以通过v-model语法糖进行向子组件传值,子组件调用父组件的方法
    3. 可以通过.sync修饰符,进行父子组件间数据的相互传递
    4. 可以通过v-bind="$attrs",将父组件的值传递到孙组件

    组件间方法相互调用:

    1. 可以通过v-on监听方法,进行子组件调用父组件的方法
    2. 可以通过v-on="$listeners",进行孙组件调用父组件的方法

    组件间属性相互查询:

    1. 可以通过ref属性,父组件查询子组件的方法
    2. 可以通过this.$parennt属性,子组件查询父组件
    3. 可以通过this.$children属性,父组件查询子组件

    (注意$children是一个类数组,使用时要具体指定某一个子组件,比如this.$children[0])

    展开全文
  • 如何实现浏览器内多个标签页之间通信? (阿里) WebSocket、SharedWorker; 也可以调用localstorge、cookies等本地存储方式; localstorge另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件, ...
  • 如何实现浏览器内多个标签页之间通信?(阿里)WebSocket的,SharedWorker;也可以调用localstorge,饼干等本地存储方式;localstorge另一个浏览上下文里被添加,修改或删除时,它都会触发一个事件我们通过监听事件...
  • WebSocket、SharedWorker; 也可以调用localstorage、cookies等本地... 我们通过监听事件,控制它的值来进行页面信息通信; 注意quirks:Safari在无痕模式下设置localstorge值时会抛出QuotaExceededError的异常;...
  • 在项目中,经常会使用到 iframe,把其它域名的内容嵌入到页面中,这对于我们来说是个很方便的方法,但是,有时候,无可避免需要多个iframe间或者iframe与主页面之间进行通信,比如交换数据或者触发一系列事件。...
  • 通过组件化的方式能够有效地将 Web 页面进行解耦,但另一问题也随之出现,组件之间如何进行通信。我们就来分析组件化 Web 应用中的组件通信问题。 一、全局状态 对于父子组件通信,框架都已给出可行的解决方案:...
  • 原文 Service Workers是一个为页面工作的后台处理器。提供离线web apps是Service Workers目前最让人...这是十分酷的,但我想谈一下Service Workers的另一个用途,使用它来管理多个web页面之间通信。 例如,你可能...
  • JavaScript跨域是指通过JS在不同的域之间进行数据传输或通信,比如用ajax向一不同的域请求数据,或者通过JS获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一不同,都被当作是不同的域。...
  • 本文主要从Web程序开发前端JavaScript脚本语言角度对窗体之间通信及控制进行说明。window对象window对象是是BOM中其他所有对象的父对象,其很属性本身就是它的子对象。通俗理解当浏览器中每打开一窗口就会创建...
  • 线程通信机制

    2015-08-08 12:02:37
    线程通信机制:共享内存 VS 消息传递在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量cou
  • 线程通信机制:共享内存 VS 消息传递在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来...
  • 那么在小程序中如何自定义组件,以及自定义组件之间如何进行通信呢 实例效果 通过上面一简单的数字加减输入框组件,阅读完本文后,您将收获到 在小程序中如何自定义组件 在小程序页面中如何使用自定义组件 父...
  • 前言对于组件的封装,在小程序当中对于多个页面...以及自定义组件之间如何进行通信呢实例效果通过上面一个简单的数字加减输入框组件,阅读完本文后,您将收获到● 在小程序中如何自定义组件● 在小程序页面中如何使用...
  • 在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成...
  • vue之组件间的通信

    2019-10-30 19:31:31
    多个组件间的数据的传递共享。 2. 为什么会出现这种问题? 在使用 vuejs 的组件进行开发的时候,我们的页面不可能只使用一个组件,肯定是很多的组件组合使用(层级关系: 1. 平级、兄弟节点 2. 嵌套:父子、爷孙),...
  • Vue中父子组件通信的小案例 由于父子组件中的data是独立的,所以不能相互直接通信,但是在一些开发中,一些数据往往是需要从上级传递到下层...那么如何进行父子组件之间通信呢? 1.父组件向子组件传递消息:通过p...
  • 父到子组件的通信 子组件是不能引用父组件或者vue实例的数据的。但是在开发中,往往一些...如何进行父子组件之间通信呢? ①通过props向子组件传递数据 ②通过事件向父组件发送消息 <body> <div id="app"&
  • 在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完...
  • 在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成...
  • 在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。...例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务
  • 这其实牵涉到组件之间如何进行通信的问题。 最佳的方式就是使用事件机制,所有组件之间可以通过一叫eventbus通用组件进行信息的交互。所以,要做到上述功能: 1. user-info-card可以在...
  • 线程之间如何进行资源共享 Linux 多个进程如何通信的? Nohup如何实现 malloc和new的区别,以及如何释放内存 进程内存互相访问 服务器上运行的服务已经发生了内存泄漏时如何处理让服务器恢复到正常状态? 二. ...
  • Java生成密钥的实例 1目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、...
  • Java生成密钥的实例 1目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、...
  • 共享内存和消息传递

    千次阅读 2017-01-03 12:04:07
    线程通信机制:共享内存 VS 消息传递 在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。...例如,我们使用多个线程去执行页面抓取任务,我
  • 如何在工作区(Workspace)导入多个项目(Project) 如何快速删除项目下Debug 文件夹中临时文件 如何快速生成一个与现有工程除了工程名外完全相同的新工程 如何解决Visual C++ 6.0不正确连接问题 引起LNK2001的常见...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

多个页面之间如何进行通信