浅谈Qt信号与槽的各种连接方式

目录
  • 简介
  • 连接信号槽 connect 函数的第五个参数
  • 信号与槽的连接方式

简介

信号槽是 Qt 框架引以为豪的机制之一。当用户触发某个事件时,就会发出一个信号(signal),这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会连接(connect)绑定一个函数(称为槽slot)来处理这个信号。也就是说当信号发出时,被连接的槽函数会自动被回调。这有点类似与开发模式中的观察者模式,即当发生了感兴趣的事件,某一个操作就会被自动触发

信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数,也可以被重载。可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽

连接信号槽 connect 函数的第五个参数

connect 函数原型如下:
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

ConnectionType 是一个定义在 Qt namespace 中的一个枚举,具体内容如下:

enum ConnectionType {
 AutoConnection,
 DirectConnection,
 QueuedConnection,
 BlockingQueuedConnection,
 UniqueConnection =  0x80
};
  • Qt::AutoConnection:默认值。根据 sender 和 receiver 所处线程在信号发出时作出判断。如果在同一线程则使用 Qt::DirectConnection 连接,否则使用 Qt :: QueuedConnection 连接。需要注意的是,这个判断和 sender 对象所处线程无关,真正判断的是发出信号这个动作所在的线程
  • Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。需要注意的是,在多线程环境下比较危险,可能会造成奔溃
  • Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个
  • Qt::BlockingQueuedConnection:槽函数的调用时机与 Qt::QueuedConnection 一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完,在多线程间需要同步的场合可能需要这个。需要注意的是,接收者和发送者绝对不能在一个线程,否则程序会死锁
  • Qt::UniqueConnection:这个 flag 可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败,也就是避免了重复连接

信号与槽的连接方式

C++ 连接信号槽 - Qt4 语法

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));

C++ 连接信号槽 - Qt5 语法

connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::close)

C++ 连接信号槽 - 函数指针

void(MainWindow:: *buttonClickSlot)() = &MainWindow::onButtonPushed;
connect(ui->pushButton, &QPushButton::clicked, this, buttonClickSlot);

C++ 连接信号槽 - Lambda 表达式

connect(ui->pushButton, &QPushButton::clicked, this, [=](){ this->close(); });

C++ 信号连接 QML 的槽

class Test {
signals:
 void sendData(QString str);
}

1)如果注册的是全局对象,则需要使用 Connections 连接:

Connections {
    target: test
    onSendData: {
        console.log(str)
    }
}

2)如果注册的是类,则需要先实例化对象,之后直接使用 on 接收:

Test {
 onSendData: {
        console.log(str)
    }
}

QML 信号连接 C++ 的槽

#include <QQuickItem>
QObject *quitButton = root->findChild<QObject*>("quitButton");
if (quitButton) {
    QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));
}

C++ 调用 QML 函数

QObject *changeBtn = root->findChild<QObject*>("objectName");
if (changeBtn)
{
    QMetaObject::invokeMethod(changeBtn, "changeColor");
}

QML 调用 C++ 函数

onClicked:
{
    className.test();
}

QML 信号连接 QML 的槽

// A.qml
Rectangle {
 signal sendData(var data)
}

// B.qml
Rectangle {
 onSendData: console.log(data)
}

到此这篇关于浅谈Qt信号与槽的各种连接方式的文章就介绍到这了,更多相关Qt信号与槽连接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈pyqt5中信号与槽的认识

    一.介绍 信号(Signal)和槽(Slot)是Qt中的核心机制,也是PyQt变成中对象之间进行通信的机制 在pyqt5中,每一个QObject对象和pyqt中所有继承自QWidget的控件都支持信号和槽 当信号发射时,连接槽函数将会自动执行,pyqt5中信号与槽通过connect()函数连接起来的. 在pyqt5中信号主要分两类: 1.内置信号(详细参考各个组件) 2.自定义信号(主要用于组件之间数据的传递与窗口交互) 二.内置信号的简单介绍 使用connect()方法将信号与槽函数绑定在一起

  • 详解PyQt5信号与槽的几种高级玩法

    信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.本文介绍了几种PyQt 5信号与槽的几级玩法. 在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制.当信号发射时,连接的槽函数将会自动执行.在PyQt 5中信号与槽通过object.signal.connect()方法连接. PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号.信号与槽具有如下特点. 一个信

  • c++ Qt信号槽原理

    1.说明 使用Qt已经好几年了,一直以为自己懂Qt,熟悉Qt,使用起来很是熟练,无论什么项目,都喜欢用Qt编写.但真正去看Qt的源码,去理解Qt的思想也就近两年的事. 本次就着重介绍一下Qt的核心功能--信号槽机制,相信接触过Qt的人都能很熟悉地使用,甚至,大部分人还能轻松地说出信息槽的几种用法.但是信号槽的核心可不是简单说说就能说清楚的. 那么,本次,就从Qt的源码中讲解一下信号槽的机制. 其实,直到写这篇文章,我也没有完全看明白相关的源码,只是明白了其中的大部分以及使用机制,其中还有很多细节

  • PyQt5通信机制 信号与槽详解

     前言 信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经常使用方法.就是内置信号和槽的使用的使用方法. 内置信号和槽 所谓内置信号与槽的使用.是指在发射信号时,使用窗口控件的函数,而不是自定义的函数.信号与槽的连接方法是通过QObject.signal.connect将一个QObject的信号连接到另一个QObject的槽函数. 在任何GUI设计

  • 深入理解Qt信号槽机制

    目录 1. 信号和槽概述 1.1 信号的本质 1.2 槽的本质 1.3 信号和槽的关系 1. 信号和槽概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号.也就是说,当信号发出时,被连

  • Qt4和Qt5的信号和槽的使用区别

    目录 信号和槽的 connect 信号和槽的 disconnect 简 述: Qt4 和 Qt5 的信号和槽的连接 connect 与断开 disconnect 区别 所谓 GUI 界面,归根结底,就是一堆组件的叠加.我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面.在放置时,组件的位置尤其重要.我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染.这就涉及到组件定位的机制.Qt 提供了两种组件定位机制:绝对定位和布局定位. 顾名思义,绝对定位就是一种最原始的定位方

  • 浅谈Qt信号与槽的各种连接方式

    目录 简介 连接信号槽 connect 函数的第五个参数 信号与槽的连接方式 简介 信号槽是 Qt 框架引以为豪的机制之一.当用户触发某个事件时,就会发出一个信号(signal),这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就会连接(connect)绑定一个函数(称为槽slot)来处理这个信号.也就是说当信号发出时,被连接的槽函数会自动被回调.这有点类似与开发模式中的观察者模式,即当发生了感兴趣的事件,某一个操作就会被自动触发 信号和槽是Qt特有的信息传输机制,是Qt设计程序的

  • 浅谈JS中的三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法 用连接符"+"把要连接的字符串连起来: str="a"; str+="b"; 毫无疑问,这种方法是最便捷快速的,如果只连接100个以下的字符串建议用这种方法最方便. 第二种方法 以数组作为中介用 join 连接字符串: var arr=new Array(); arr.push(a);

  • 浅谈QT内存泄漏

    目录 01前言 02 QT半自动化内存管理要点 03实验过程详解 Malloc分配的内存空间实践实例 04总结 01前言 前几天,项目开展了一次代码初次评审.会上,领导指出一些可能会带来内存泄漏的代码,如下图所示: 图中的pLayout在new的时候没有指定任何父对象,且MainWindow的析构函数中也没有对pLayout做delete操作,这意味着为pLayout申请的内存空间在程序运行期间是一直没有得到释放的.实际上,项目代码中,还有许多这种"隐患":一个单例类的成员变量在new

  • 浅谈Qt实现HTTP的Get/Post请求

    目录 头文件 Get Post 借助Qt的NetWork模块,可以轻松的实现HTTP的Get/Post请求,而不需要再次引用像libcurl这样的第三方库.当然,Qt的NetWork模块提供的功能远远不只是HTTP方面的. 头文件 #include <QNetworkRequest> #include <QNetworkReply> #include <QNetworkAccessManager> 另外,使用Qt网络模块还需要引用Qt5Network.lib库. Get

  • 浅谈Qt中使用CEF的几个要点(Windows下)

    最近项目中要在Qt中使用CEF(Chromium Embedded Framework),在这里总结下其中的几个要点. 下载合适的CEF版本 关于CEF的简介我们这里就不做介绍了,下载CEF可以有2种选择: 1.源码:强烈不建议下载源代码并编译构建(学习代码除外),下载源码需要你FQ.有良好的网速(要下载)和足够的耐心(据说有4.5个G,真的要下半天). 2.自动构建版本:推荐这个使用这个版本.该版本提供了大部分已经编译完成的动态库及资源,只需要开发者手动编译一个wrapper静态库就可以了.这

  • 浅谈Qt QGraphics体系及刷新机制介绍

    概述 Qt的三大体系:QWidget.QGraphics.Quick,其中QGraphics图形框架算是这三个中比较高级的一种用法了,并且使用起来相比另外两个体系会更加的复杂一些,不过它能实现的功能却非常强大,主要体现在对图元的管理,它独特的刷新机制可以在众多的图元中都能够很好的管理,保证整个交互的流畅度. 而这里要描述的就是QGraphics体系的刷新机制以及该体系中相关元素的使用方式及特点. QGraphics体系的三大元素 QGraphics体系中最重要的三大元素:QGraphicsVie

  • 浅谈Linux信号机制

    一.信号列表 root@ubuntu:# kill -l  1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP  6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20)

  • Qt 信号自定义槽函数的实现

    目录 使用无参数信号与槽 使用有参信号传递 点击按钮触发信号 匿名函数与槽 Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法. 使用无参数信号与槽 首先定义一个teacher类,该类中用于发送一个信号,其次student类,定义用于接收该信号的槽函数,最后在widget中使用emit触发信号,当老师说下课时,学生请客吃饭. teacher.h 中只需要定义信号.定义一个 void hungry(); 信号

  • Qt信号与槽知识点总结归纳

    目录 一.含义与使用 (一).含义 (二).connect使用 (三).信号函数 (四).槽函数 二.示例 总结 一.含义与使用 (一).含义 信号与槽是qt中一种常用的通信手段.发送方发送信号,接收方通过槽进行接收并完成具体任务. 简单来讲,就是通过发送一个函数(信号),接收方通过另一个函数(槽)完成任务. (二).connect使用 用法上,通过connect函数进行连接. connect(发送方地址,信号函数,接收方地址,槽函数); 比如我们举如下例子: 通过点击按钮实现关闭窗口. myW

  • 浅谈Web页面向后台提交数据的方式和选择

    1.通过表单提交 这是HTML支持最传统的提交方法,需要创建表单,然后表单包含各种类型的表单元素,还要有一个提交按钮,通过提交按钮来提交到后台,这种方式提交后页面会刷新. 2.通过网页链接提交 可以在网页的链接附上需要提交的参数,当用户点击链接后,浏览器发起向链接的访问,从而也把链接附带的参数提交到后台,这种方式提交后页面也会刷新. 3.通过ajax提交 Javascript支持ajax方式创建HTTP请求,可以通过在HTML页面元素的事件处理函数中创建ajax请求,在url参数里携带所需提交的

随机推荐