精华内容
下载资源
问答
  • Qt 信号槽介绍

    2018-05-06 14:24:18
    详细介绍Qt 信号槽,如何定义信号槽以及对比Qt4 和Qt5 信号槽的区别
  • QT信号槽

    千次阅读 2012-05-22 14:53:31
    信号槽Qt中特有的概念。它使得程序员将不同的object绑定起来,而object对象间并不需要对相互了解。 Slots也是普通的c++方法,它们可以是virtual;可以被重载;可以使private、protected、public,可以像其它c++方法...

            信号槽是Qt中特有的概念。它使得程序员将不同的object绑定起来,而object对象间并不需要对相互了解。 Slots也是普通的c++方法,它们可以是virtual;可以被重载;可以使private、protected、public,可以像其它c++方法一样有各种类型的参数,Signals则无这些属性。它们唯一的区别就是signal与slot是相互链接起来的,slot函数在每次signal函数被emit时会被调用。

    声明信号,跟函数不一样,不需要定义

    signals:

    void mySignal();

    void mySignal(int x);

    void mySignalParam(int x,int y);


    在用到的地方发送信号(先建立了信号与槽的连接,才能接受信号)

    emit mySignal();

     

    声明槽,slots有public等属性,槽就相当于定义的一个函数,在里面实现某些功能。

    public slots:

    void mySlot();

    void mySlot(int x);

    void mySlot(int x,int y);

     

           连接信号signal和槽函数slot:

           connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()));

           sender和receiver是QObject对象的指针,signal和slot函数是不带参数的函数名,实际上SIGNAL()和SLOT()宏将他们的参数(signal和slot函数)转换成相应的字符串。

    注意

    1、一个信号可以连接到多个槽:
    connect(sender, SIGNAL(mySignal(int)),receiver1, SLOT(mySlot(int)));
    connect(sender, SIGNAL(mySignal(int),receiver2, SLOT(mySlot(int)));
    当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。

     

    2、多个信号可以连接到同一个槽
    connect(sender1 SIGNAL(mySignal1()), receiver, SLOT(mySlot()));
    connect(sender2, SIGNAL(mySignal2()),receiver, SLOT(mySlot()));
    任何一个信号发出,槽函数都会执行。

     

    3、一个信号可以和另一个信号相连
    connect(sender, SIGNAL(mySignal1()),
                  this, SIGNAL(mySignal2()));
     第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号的连接和信号与槽连接相同。
     
    4、连接可以被删除
    disconnect(sender, SIGNAL(mySignal()),receiver, SLOT(mySlot()));
    这个函数很少使用,因为当一个对象被删除后,Qt自动删除这个对象的所有连接。

     

    5、参数设置

        信号和槽函数必须有着相同的参数类型及顺序,这样信号和槽函数才能成功连接:
    connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int, const QString &)));
    如果信号里的参数个数多于槽函数的参数,多余的参数被忽略:
    connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int)));

     

    6、获得对象

    QObject * QObject::sender () const [protected]

    sender () 函数返回 信号发出者 的 QObject型指针。

    QObject型指针进行强制转换得到需要的。

    在槽函数里使用得到信号发送对象。

    例如:

    mySlot(){

        currentGlWidget = qobject_cast<GLWidget *>(sender());

        QPushButton* btn= dynamic_cast<QPushButton*>(sender())

    }


    带返回值的信号槽


    槽函数有返回值

    可通过  value = emit mysignal() 得到返回值。

    展开全文
  • QT 信号槽

    2014-05-07 13:43:51
    函数原型 1 QMetaObject::Connection QObject::connect(const QObject* sender, const char* signal, const QObject* ... method, Qt::ConnectionType type=Qt::AutoCon
    函数原型
    1 QMetaObject::Connection QObject::connect(const QObject* sender, const charsignalconst QObject* reciver, const char* method, Qt::ConnectionType type=Qt::AutoConnection)

     

    创建一个从发送方指定信号到接收方方法的链接,返回链接的句柄,可以用于断开链接。可以通过转换为bool值来判断Connecton是否有效。
    发送方的信号和接收方的方法(槽)都是以字符指针的形式传递进来的,可以通过两个宏SIGNAL(), SLOT()将指定的信号和槽转换为字符指针形式。
    例如:
    1 QLabel *label = new QLabel; 2 QScrollBar *scrollBar = new QScrollBar; 3 QObject::connect(scrollBar, SIGNAL(valueChanged(int)), 4 label, SLOT(setNum(int)));

     

     
    信号和槽的参数中只能指定参数类型,不可以包含参数名字,以下的方法就是错误的:
    1 // WRONG
    2 QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
    3 label, SLOT(setNum(int value)));

     

    一个信号可以连接到多个信号和槽,多个信号也可以连接到一个槽。如果一个信号连接到多个槽,当信号产生时,槽被激活的顺序与连接被创建的顺序相同。
    可以通过disconnect()函数来断开连接。
    connect方法的最后一个参数类型是ConnectionType,这是一个枚举类型,包含以下字段:
    字段
    描述
    Qt::AutoConnection
    0
    (默认值)如果信号的发射与接收方在不同线程,则与Qt::QueuedConnection行为一致;否则,直接调用槽,行为与Qt::DirectConnection一致。连接类型在信号被发射时确定
    Qt::DirectConnection
    1
    信号被发射时,立即调用槽函数
    Qt::QueuedConnection
    2
    当接收方的消息循环得到控制权时,槽函数才会被调用;槽函数在接收方的线程中执行
    Qt::BlockingQueuedConnection
    3
    与Qt::QueuedConnection行为一致,但是当前线程是阻塞的。这种连接类型只能被用接收方与发送方处于不同线程的情形下。
    Qt::UniqueConnection
    0x80
    这个标志可以与上面三个中的任意一个组合。当此标志被设置时,如果Connection已经存在(同一个信号连接到同一个对象的同一个槽),则connect函数会失败
     
    在使用QueuedConnection时,参数必须要在Qt的元对象系统中注册,否则会返回错误信息:
    QObject::connect: Cannot queue arguments of type 'MyType' (MyType是你自定义的类型)
    因为Qt需要复制参数到后台消息队列中存储,所以在使用自定义连接类型时需要调用qRegisterMetaType()函数来注册。
     
    看 到这里,做过Win32开发的人,就会觉得很熟悉了。是的,就是PostMessage, SendMessage。Qt中Connection的DirectConnection类型对应了 SendMessageTimeOut,QueuedConnection类型对应了 PostMessage,BlockingQueuedConnection类型对应了SendMessage。在做Win32开发时,需要注册窗口类, 系统才会为其维护一个后台消息队列,只有具有后台消息队列的对象才可以处理PostMessage,SendMessage消息,而Qt中的 qRegisterMetaType()函数,毫无疑问就是充当了这个角色。
     
    Win32 SDK是以消息的形式来响应用户事件的,无论怎么变,怎么改名词,信号,槽等等,“消息”这个核心是改变不了的。
    展开全文
  • Qt 信号槽连接方式

    千次阅读 2017-03-05 08:51:07
    Qt 信号槽连接方式

    Qt 信号槽通过connect连接,一般的写法

    connect(ui->pushButton, SIGNAL(clicked(bool)), plugin_, SLOT(testSlot()));


    tesSlot() 在头文件通过slots: 标识。最近看qtcreator的代码,发现有新写法、新用法


    1. testSlot() 并不需要使用slots 标识,但需要使用下面connect 方法:

    private:
    	void testSlot();

    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::testSlot);
    通过使用& 取地址符,可连接任意方式定义的号码,甚至标志了signal的信号函数


    2. plugin_ 是一个抽象类接口引用, testSlot()并不需要是plugin_的接口,只要在运行时存在于实现子类中就可以 connect 到该函数

    // 父类
    class IPlugin : public QObject
    {
    	Q_OBJECT
    public:
    	IPlugin(){}
    	~IPlugin(){}
    };
    
    // IPlugin 子类
    class Plugin : public IPlugin
    {
    	Q_OBJECT
    public:
    public slots:
    	void testSlot();
    };


    可这样使用:

    IPlugin* pluging = new Plugin();
    connect(ui->pushButton, SIGNAL(clicked(bool)), pluging, SLOT(testSlot()));






    展开全文
  • Qt信号槽分析总结

    千次阅读 2016-09-28 10:30:23
    1.先说Qt信号槽的几种连接方式和执行方式。 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的方式。信号发出的线程和糟的对象在一个线程的时候相当于:DirectConnection,...

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的。

    1.先说Qt信号槽的几种连接方式和执行方式。

    1)Qt信号槽给出了五种连接方式:

    Qt::AutoConnection 0 自动连接:默认的方式。信号发出的线程和糟的对象在一个线程的时候相当于:DirectConnection, 如果是在不同线程,则相当于QueuedConnection
    Qt::DirectConnection 1 直接连接:相当于直接调用槽函数,但是当信号发出的线程和槽的对象不再一个线程的时候,则槽函数是在发出的信号中执行的。
    Qt::QueuedConnection 2 队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。线程安全的。
    Qt::BlockingQueuedConnection 3 阻塞连接:此连接方式只能用于信号发出的线程(一般是先好对象的线程) 和 槽函数的对象不再一个线程中才能用。通过信号量+postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。但是发出信号后,当前线程会阻塞,等待槽函数执行完毕后才继续执行。
    Qt::UniqueConnection 0x80 防止重复连接。如果当前信号和槽已经连接过了,就不再连接了。

    2)信号槽的调用方式和线程:

    UniqueConnection 模式:严格说不算连接方式,方式就是4中,此只是一个附加的参数。不讨论。

    AutoConnection 模式:这个模式是默认的,但其可以看作是DirectConnection和QueuedConnection的自动选择,直接分析那两种也就行了。

    发出信号,调用槽的方式也可以简单的分为两种:同步调用和异步调用

    同步调用:发出信号后,当前线程等待槽函数执行完毕后才继续执行。

    异步调用:发出信号后,立即执行剩下逻辑,不关心槽函数什么时候执行。

    所以有下表:

    线程/模式 DirectConnection QueuedConnection BlockingQueuedConnection
    相同线程 直接调用,同步调用。 通过事件进行队列调用。异步调用. 不可用
    不同线程 直接调用。同步调用。槽函数在发出信号的线程执行。有线程安全隐患。 通过事件进行队列调用。异步调用.槽函数在对象所在的线程执行。线程安全。 通过事件进行阻塞调用。同步调用。槽函数在对象所在的线程执行。线程安全。
    Qt事件循环依赖 直接调用,不依赖Qt事件循环 通过事件进行队列调用。依赖,槽函数所在对象的线程必须启用Qt事件循环 通过事件进行队列调用,用信号量实现阻塞。依赖,槽函数所在对象的线程必须启用Qt事件循环

    2.Qt信号连接多个槽,调用顺序。

    先说基本原则:

    槽函数开始调用的顺序和连接的顺序是一致的。

    但是,上面也说了,有同步调用和异步调用。

    对于同步调用,你观察的结果和基本原则一样。

    但是对于异步调用,可能你最先连接的它,但是可能其他都执行完毕了,但是其还没执行。是因为对于异步调用:是开始调用的时候,生成一个需要调用这个函数的事件,然后放到事件队列里。然后立即返回,去执行调用其他槽函数或者槽函数都执行了,不关心槽函数的执行状态的。等到事件队列里任务轮到此事件再去调用。

    3.信号的返回值。

    大都说Qt信号槽不能使用返回值。其实不不准确的,Qt5中,信号槽是有返回值的。只是Qt的一个信号可以连接多个槽,还有同步调用和异步调用的问题,没发支持的很好,所以,返回值虽有,但只是鸡肋。

    先说下返回值的规则把:

    • 同步调用才有返回值,异步调用的返回值永远为返回值类型默认构造函数出来的。
    • 连接的多个槽都返回值,那么结果是最后调用(连接)的那个。

    也就是说对于QueuedConnection连接的信号槽,永远只是返回返回类型的默认构造函数的。对于AutoConnection连接的,如果发出信号的线程和槽函数线程不同亦然。

    测试小例子地址:https://github.com/dushibaiyu/DsbyLiteExample/tree/master/QtSignalsSlotTest

    4.信号参数的安全问题:

    因为一个信号可以连接多个槽函数,如果参数是T * 或者是T &话会不会第一个槽函数改变参数的值,然后第二此调用的参数就已经不是信号发出的值?

    1)对于T &: 在同步调用中则是变化的,不可用于异步,不可跨线程。所以BlockingQueuedConnection方式的同步也不行。(T& 不可用在队列调用(QueuedConnection)和阻塞调用(BlockingQueuedConnection)中。只能使用const T &。)

    因为同步调用,你可以理解成直接调用,那么连接多个槽函数就相当于直接连续调用多个函数。类似于:

    01 // 函数原型都是:void  (int &a )
    02 int a;
    03 fun1(a);
    04 fun2(a)
    05 ·····
    06  
    07 // 函数原型都是:void  (int * a )
    08 int a;
    09 pfun1(&a);
    10 pfun2(&a)
    11 ·····

    这样,当第一个函数执行改变参数值之后,其后的函数调用都要受影响。

    2) 对于T *,最好不要同时连接多个槽。

    对于同步调用:是一个接着一个调用的,执行顺序类似上面,所以值也是每次调用也会变化的。

    对于异步调用:其内容确实不确定的,因为异步调用的时间是不可控的。如果还有跨线程相关,则还有线程安全问题。

    5.信号槽性能损失:

    注:仅仅代码层进行的理论分析,非实际测试,不严谨,不权威。

    关于信号槽(很多吐槽Qt就是说的这个):

    (1)Qt4语法的,都说是匹配字符串,其实只是链接信号槽的用的匹配字符串 的方法,通过字符串找到信号和槽在QMeatObject里存的索引位置int类型,还有槽函数的索引,然后调用的时候通过索引号用switch去区分的 发射的那个函数,然后取出对应的链接槽的list,循环检测槽函数的参数是否匹配,然后调用槽函数。。这个链接时会耗时查找,但是你能有多少信号?这个链 接也耗时不多,调用的时候耗时主要就是在参数匹配上了。

    (2)Qt5 语法的,Qt5 的槽函数链接和执行是基于模板实现的,函数对象。信号和槽的参数问题是编译时检查的,执行效率更高,但是编译就慢点了。链接时也是通过信号的地址找到其的 信号索引,至于槽函数直接是生成一个函数对象的,然后调用的时候也是先switch找到发射的信号,取出list,然后逐个调用其储存的函数对象,所以对 于Qt5 语法的信号槽,调用性能损失几乎可以说无的。

    (3)链接的信号槽的时候,Qt::UniqueConnection的链接方式会对已经链接过的此先好的槽函数进行遍历,会有链接时的损失。其他链接的损失就在上面说过了。
    (3)在信号槽调用的时候,还有一些链接方式和线程的判断和为了安全问题的锁操作。关于这个就还涉及到调用槽函数的线程问题。

    对于同线程直接调用,较函数对象直接调用的损失,就只有链接方式和线程的判断的几个if 分支和 锁的操作。
    对于线程间通讯的调用,跨线程。信号槽内部也是通过Qt事件循环机制实现的,跨线程就不是时时调用了,主要是安全了,对于性能有没有损失没法评论的。对于跨线程阻塞的调用,这个也是事件实现,只是但发射信号的线程会阻塞,这个找不到对应的直接调用的比较,也不好说。
    关于信号槽Qt是作何很多方便使用和安全调用,较之函数指针,性能会有损失,但是也没损失多少的。对于函数对象调用,Qt5语法的调用,几乎是不损失什么的。

     

    注:此文是个人根据文档,源码和自己写小例子测试得出的总结,如有错误请您指出。

    http://www.dushibaiyu.com/2015/07/qt-signals-slots-connect.html

    展开全文
  • 主要讲解了Qt信号槽的机制,有需要的可以看看。
  • Qt信号槽如何传递参数

    万次阅读 2019-02-23 23:35:43
    Qt信号槽如何传递参数 利用Qt进行程序开发时,有时需要信号-槽来完成参数传递。带参数的信号-槽在使用时,有几点需要注意的地方,下面结合实例进行介绍。 1. 当信号与槽函数的参数数量相同时,它们参数类型要完全...
  • 测试Qt信号槽中不同的参数的传递差别,具体可参考文章 https://www.jianshu.com/p/f9bf3241aa24
  • QT信号槽操作示例

    2014-07-04 13:56:26
    信号槽示例代码,适合QT初学者学习信号槽的操作。
  • Qt信号槽传参没反应

    2019-04-22 17:32:51
    Qt信号槽传参没反应 -* 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的...
  • Qt 信号槽原理解析

    千次阅读 2018-05-09 10:27:24
    资料 英文剖析源码 http://woboq.com/blog/how-qt-signals-slots-work.html Qt豆子翻译版 ...Qt信号槽的简单实现 https://blog.csdn.net/fuyunzhishang1/article/details/...
  • QT信号槽的连接方式有五种: Qt::AutoConnection 信号槽默认的连接方式,如果信号与槽在同一线程,就自动采用Qt::DirectConnection, 如果信号与槽不在同一线程,将自动采用Qt::QueuedConnection的连接方式。 Qt::...
  • QT信号槽,在两个窗口之间利用emit进行数据传输 信号槽理解 QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::Auto...
  • QT信号槽connect函数详解

    万次阅读 2018-10-29 17:21:24
    使用QT开发时,通常使用connect函数只传递四个参数: connect(Sender,SIGNAL(signal),Receiver,SLOT(slot)); 所以我们有可能认为该函数就只有四个参数,但实际上是有第五个参数的,只是通常该函数已经给第五个参数...
  • 简单介绍了两个信号的链接方法
  • QT信号槽多次连接引起的错误修改

    千次阅读 2016-05-16 22:25:02
    1. 问题描述:在有关QT的编程中,遇到了这样的问题,当由于对QT信号槽连接机制的不理解,导致了对同一个信号槽进行了两次或以上的连接,结果在之后的代码调试中便发生了与自己期望不同的结果。通过在网络上查找相关...
  • 深扒Qt信号槽(Windows平台)

    万次阅读 2019-08-08 12:39:10
    在上一篇简单实现Qt信号槽中,我们简单模拟了Qt信号槽,从信号发出到槽函数调用我们已经基本了解了,但一些Qt自带的信号是怎么发射出来的呢?今天我们就来深扒一下。 为了方便起见,我们先找一张Qt继承关系图 ...
  • Qt信号槽-原理分析

    千次阅读 2019-07-20 10:18:14
    信号槽QT的核心机制,我们平时用的时候只知道按标准的用,并不了解信号槽机制的原理,本篇就介绍信号槽的原理
  • @[TOC]QT信号槽报错can’t find linker symbol for virtual table fors 今日在QT练习 自定义信号槽的过程中遇见调试时终端报“ can't find linker symbol for virtual table for `QApplication' value ”的问题。 !...
  • 利用Qt进行程序开发时,有时需要信号槽来完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方,下面结合实例进行介绍。 第一点:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。 signals:...
  • QT信号槽传递参数技巧

    万次阅读 多人点赞 2017-12-24 21:26:20
    利用Qt进行程序开发时,有时需要信号槽来完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方,下面结合实例进行介绍。 第一点:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。 信号: ...
  • Qt信号槽自动关联

    千次阅读 2018-09-06 15:29:46
    想要函数自动关联信号函数名称必须遵循以下规则: void on_&lt;object name&gt;_&lt;signal name&gt;(&lt;signal parameters&gt;); 注意:这里是对象名称,也就是setObjectName...
  • Qt 信号槽机制

    千次阅读 2014-04-04 14:36:37
    Qt 因其信号槽机制闻名遐迩。但是信号槽是怎样工作的?本文将解释 QObject 和 QMetaObject 的内部实现,以及探索如何在这种机制下实现信号槽。 本文将展示 Qt5 的部分代码,不过有时会为格式化以及简洁性而有所修改...
  • Qt信号槽连接的几种方式

    千次阅读 2018-05-13 16:59:36
    信号槽在同一线程,同Qt::DirectConnection.不在同一线程,同Qt::QueuedConnection. Qt::DirectConnection 发射完信号后立即执行槽,只有槽函数执行完成返回后,发射信号后面的代码才可以执行 Qt::...
  • Qt信号槽--入门必备

    2014-09-01 15:35:01
    非常实用的QT入门知识,适合于初学者自学使用
  • QT信号槽的继承

    2020-10-29 14:25:34
    继承中的信号:在QT中,信号不需要实现,只要声明就可以了。所以不存在继承这一回事,我只是在父类和子类中都声明一下,也用不着virtual 继承中的:正常了,跟普通函数没区别。
  • Qt信号槽不响应信号的几种情况

    万次阅读 2018-08-06 13:57:23
    Qt进行信号与信号槽连接后,会出现信号槽不响应信号的情况,原因可能是以下的情况: 1、类没有声明Q_OBJECT; 2、信号槽没有定义为pubic/private slots; 3、事件被子控件过滤掉了。比如QListWidget,当...
  • QT信号槽绑定规则

    2018-05-15 18:57:41
    实例connect(ui-&gt;comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboxIndexChange(int)));connect(发出信号者,SIGNAL( 信号者的信号),连接对象, 回调函数,连接方式);...
  • 1.先说Qt信号槽的几种连接方式和执行方式。 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的方式。信号发出的线程和糟的对象在一个线程的时候相当于:DirectConnection, 如果是...
  • ArbStruct用于生成封装的类,UseArbStruct是主程序,它调用了ArbStruct

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,676
精华内容 13,070
关键字:

qt信号槽