精华内容
下载资源
问答
  • QT使用信号与槽注意事项

    千次阅读 2018-11-28 22:13:57
    QT使用信号与槽注意事项 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 目录 文章目录QT使用信号与槽注意事项@[toc]前言1.基本用法2.slots的函数用法3.slots的lambda表达式4....

    QT使用信号与槽注意事项


    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    目录

    环境:
    QT版本:5.6.2
    VS版本:VS2013
    系统版本:windows 7 64bit


    前言

    Qt 信号槽一直以来都是QT的核心之一。但是,大家真的对信号的槽非常了解吗?下面介绍的一些内容,你可能并不知道。

    1.基本用法

    QLabel *label = new QLabel;
    QLineEdit *lineEdit = new QLineEdit;
    QObject::connect(lineEdit, &QLineEdit::textChanged,label,  &QLabel::setText);
    

    2.slots的函数用法

    函数原型:

    QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
    

    使用:

    void someFunction();
    
    QPushButton *button = new QPushButton;
    QObject::connect(button, &QPushButton::clicked, someFunction);
    

    3.slots的lambda表达式

    QByteArray page = ...;
    QTcpSocket *socket = new QTcpSocket;
    socket->connectToHost("qt-project.org", 80);
    QObject::connect(socket, &QTcpSocket::connected, [=] () {socket->write("GET " + page + "\r\n");});
    

    4.断开连接到对象信号的所有Object

    disconnect(myObject, 0, 0, 0);
    

    等同于

    myObject->disconnect();
    

    5.断开连接到特定信号的所有Object

        disconnect(myObject, SIGNAL(mySignal()), 0, 0);
    

    等同于

    myObject->disconnect(SIGNAL(mySignal()));
    

    6.断开特定接收者

    disconnect(myObject, 0, myReceiver, 0);
    

    等同于

    myObject->disconnect(myReceiver);
    

    7.connect函数的第5参数Qt::ConnectionType

    参数说明
    Qt::AutoConnection0(默认)如果接收者位于发出信号的线程中,则使用Qt :: DirectConnection。 否则,使用Qt :: QueuedConnection。 连接类型在发出信号时确定
    Qt::DirectConnection1发出信号时立即调用插槽。 插槽在信号线程中执行。相当于槽函数直接执行,执行完之后,才继续执行信号的后续内容
    Qt::QueuedConnection2槽函数在控制回到接收者所在线程的事件循环时被调用。 槽函数在接收者的线程中执行。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用
    Qt::BlockingQueuedConnection3与Qt :: QueuedConnection相同,除了信号线程阻塞直到槽返回。 如果接收者与信号位于同一线程中,则不得使用此连接,否则程序将会死锁
    Qt::UniqueConnection0x80这是一个可以使用按位OR与上述任何一种连接类型组合的标志。 当设置Qt :: UniqueConnection时,如果连接已经存在,QObject :: connect()将失败(即,如果相同的信号已连接到同一对对象的相同插槽)。 这个标志是在Qt 4.6中引入的

    这里需要注意的是一般我们都是采用默认参数Qt::AutoConnection。但是,需要注意有时可能会出现问题。
    例如,我们要在登录成功后关闭当前界面。实现如下:

    void login()
    {
    ...
    //验证完毕,返回登录成功信号
    emit loginSuccess();
    this->hide();
    }
    

    如果此时我们采用Qt::AutoConnection,并且信号与槽位于同一线程,那么QT会自动为我们选择为Qt::DirectConnection方式。也就是必须等待信号对应的槽函数执行完,才能执行hide操作。这是如果槽函数是一个耗时操作,那么就会出现无法hide的情况,这种情况下,我们需要手动设置Qt::QueuedConnection或者将hide函数在emit之前执行。

    总结一下就是emit函数之后的内容的执行顺序与信号与槽的连接方式有关。如果需要立即执行emit之后的函数,就需要设置为Qt::QueuedConnection,如果要立即执行槽函数,就需要设置为Qt::DirectConnection。

    8.QObject::connect: Cannot queue arguments of type ‘XXX’

    出现这个错误是由于对于Qt::QueuedConnection连接,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将它们存储在幕后的事件中。
    在建立连接之前,请调用qRegisterMetaType()注册数据类型。

    9.QTimer的 singleShot

    函数原型:

    [static] void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
    
    QTimer::singleShot(100,this, &A::function());
    
    QTimer::singleShot(100,[=]{qDebug() << "time out"; });
    

    Reference:

    1. http://doc.qt.io/qt-5.6/qobject.html#connect-2
    2. http://doc.qt.io/qt-5.6/qt.html#ConnectionType-enum

    觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
    在这里插入图片描述
    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    展开全文
  • Qt-信号

    2021-01-07 17:24:42
    2.Qt::DirectConnection:信号的发送者与信号的接收者在同一线程中执行,当发出信号后,会马上进入槽函数,看上去就像在信号 发送位置调用了槽函数,在多线程下会比较危险,容易造成崩溃。 3.Qt::QueuedConnection:...

    一 信号槽的第五个参数

    1.Qt::AutoConnection:信号的发送者与信号的接收者在同一线程,则默认使用Qt::DirectConnection;如果不在同一线程,则默认 使用Qt::QueuedConnection。

    2.Qt::DirectConnection:信号的发送者与信号的接收者在同一线程中执行,当发出信号后,会马上进入槽函数,看上去就像在信号 发送位置调用了槽函数,在多线程下会比较危险,容易造成崩溃。

    3.Qt::QueuedConnection:信号的发送者与信号的接收者不在同一线程中执行,槽函数运行于信号的接收者线程,当发送信号后, 槽函数不会马上被调用,等待信号的接收者把当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

    4.Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

    5.Qt::UniqueConnection:可以通过按位或(|)与以上四个结合在一起使用。当设置此参数时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

    二 信号-槽的连接方式

    6.信号-槽的连接方式

    1)、connect(this,SIGNAL(),this,SLOT());

    例:connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(onClicked()));

    2)、connect(this,&this::signal,this,&this::slot);

    例:connect(ui.pushButton,&QPushButton::clicked,this,&Widget::onClicked);

    7.信号-槽

    1)、信号可以连接信号。

    2)、信号可以连接槽,一个信号可以连接多个槽,槽的调用顺序是不确定的。

    3)、多个信号可以连接同一个槽。

    4)、信号与槽都可以被重载、重载后使用6中的第一种方式连接要好一些,因为第一种连接方式能带上参数。

    1. 信号连接多次后,槽函数也将执行多次

    8.断开信号-槽

    disconnect(this,SIGNAL(),this,SLOT());
    
    disconnect(this,&this::signal,this,&this::slot);
    

    //也可以阻塞信号,信号槽同样不会响应

    9.使用信号-槽要求

    1)、继承自QObject类,必须声明Q_OBJECT宏

    2)、声明信号signals、Q_SIGNALS,一般信号都为void型,没有private、public、protected区分。

    例:void sigSendData();

    发射信号:emit sigSendData()、或者Q_EMIT sigSendData();

    3)、声明槽slots、Q_SLOTS,槽有private、public、protected区分,槽相当于成员函数,可以直接调用

    槽可以重载(因为他相当于成员函数)。

    10.注意事项

    1)、宏定义不能放在信号-槽中。

    2)、构造函数不能声明在信号-槽中。

    3)、函数指针不能作为信号-槽参数。

    11lamda connect 方式

    connect(ui_.setSpeedPushButton, &QPushButton::clicked, [this]
    {
        if (ui_.speedTableWidget->item(0, 0) && ui_.speedTableWidget->item(1, 0))
        {
            auto text1 = ui_.speedTableWidget->item(0, 0)->text();
            auto text2 = ui_.speedTableWidget->item(1, 0)->text();
            adserver_.xSpeedAndOmegaSpeed(text1.toFloat(), text2.toFloat());
        }
    });
    

    capture mutable ->return-type{statement}

    [ ] 中的参数
    1.[var]表示值传递方式捕捉变量var;
    2.[=]表示值传递方式捕捉所有父作用域的变量(包括this);
    3.[&var]表示引用传递捕捉变量var;
    4.[&]表示引用传递方式捕捉所有父作用域的变量(包括this);
    5.[this]表示值传递方式捕捉当前的this指针。

    上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda的“{}”代码块。上面的捕捉列表还可以进行组合,例如:

    1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
    2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

    不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

    3.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
    4.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

    展开全文
  • QT信号

    2021-03-09 17:25:35
    信号槽第五个参数,enum Qt::ConnectionType 类型 描述 Qt::AutoConnection 信号和槽,如果是同一个线程使用Qt::DirectConnection,不同使用Qt::QueuedConnection。信号发出时确定。 Qt::DirectConnection...

    信号槽

    信号槽第五个参数,enum Qt::ConnectionType

    类型描述
    Qt::AutoConnection信号和槽,如果是同一个线程使用Qt::DirectConnection,不同使用Qt::QueuedConnection。信号发出时确定。
    Qt::DirectConnection发出信号时立即调用插槽。槽在信号线程中执行。
    Qt::QueuedConnection当控制返回到接收方线程的事件循环时,将调用槽。槽在接收方的线程中执行。
    Qt::BlockingQueuedConnection信号发出后,等待槽函数执行完成。同一个线程中不能使用,会死锁
    Qt::UniqueConnection可以通过位或于上述类型结合使用,如果信号与槽已经连接,connect会失败

    注:对于queued 连接,参数必须是Qt元对象系统已知的类型,因为Qt需要复制参数,将它们存储在后台的事件中。多线程中使用自定义数据类型会提示: QObject::connect: Cannot queue arguments of type ‘MyType’
    在建立连接之前,调用qRegisterMetaType()注册数据类型。

    展开全文
  • QT信号和槽机制

    2018-01-22 17:56:38
    为了解开程序界面中不同对象的耦合,QT提供了信号和槽机制用于界面操作的响应,是完成任意两个QT对象之间的通信机制。QT对象包含许多预定义的信号和槽。 信号:在某个特定情况或者动作下被触发而发出的消息 槽:...

    什么是信号和槽机制?

    为了解开程序界面中不同对象的耦合,QT提供了信号和槽机制用于界面操作的响应,是完成任意两个QT对象之间的通信机制。QT对象包含许多预定义的信号和槽。
    信号:在某个特定情况或者动作下被触发而发出的消息
    槽:接收并处理信号的消息的函数。
    当一个特定的事件发生时,一个信号被发送,与信号相关联的槽会响应信号并完成的相应的处理。

    连接方式

    在对应类中的构造函数中添加以下代码:

    connect(Object1,SIGNAL(signal1),Object2,SLOT(slot1));

    或者:

    connect(Object1,"clicked()",Object2,"slot1()");

    slot1为定义的处理函数,需要在对应类的头文件中定义。例如:

    private slots:
       void slot1();

    优点

    • 优点:
      • 类型安全(方法签名)
      • 松散耦合

    效率

    通过传递信号来调用槽函数将会比直接调用非虚函数的运行速度慢十倍。原因如下:
    * 需要定位接收信号的对象
    * 安全的遍历所有的关联
    * 编组/解组 传递的参数
    * 多线程的时候,信号可能需要排队等待
    然而,对于创建堆对象的new和delete操作而言,信号和槽的运行代价只是它们很少的一部分,信号和槽导致的这点性能损耗,对实时应用程序是可以忽略的。同信号和槽机制的灵活性和简便性而言,这点性能的损失也是值得的。

    不过我们一般是使用可视化界面设计直接生成了预定义的信号和槽机制的代码….

    展开全文
  • Qt信号与槽的连接方式制定了一个信号是立即传递一个槽还是排队等待传递到一个槽。它支持信号与槽连接类型枚举如下: enum ConnectionType { AutoConnection, DirectConnection, QueuedConnection, ...
  • Qt程序默认只有一个线程,而该线程要时刻响应界面,所以Qt中设计了信号和槽机制,当执行一个操作时,界面会发出信号,然后槽函数响应并执行,然后再返回界面,当执行一个耗时较长的操作时,界面会卡住。 所有当需要...
  • QT5信号槽个人总结

    2020-12-23 18:01:57
    一、关于qt信号槽的理解 这里沿用豆子大佬的话说,所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果...
  • QT-信号槽connect函数

    2021-08-31 17:15:47
    信号与槽是Qt的一个核心特点,是对象间进行通信的一个机制,类似于回调函数(callback),需要由Qt的元对象系统支持才能实现。 static QMetaObject::Connection connect(const QObject *sender , const char *...
  • Qt中管理多线程的方式有很多,其中典型的生产者消费者模型中应用信号量机制,这个方式在Qt中封装在一个名为QSemaphore的类中。 应用中使用连个信号量,一个作为生产者,另一个作为消费者,类似于哨兵,在第一个进程...
  • QT】深入qt信号与槽实现原理

    万次阅读 2017-07-01 05:19:38
    1、先上示例代码先上示例代码直观地感受一下qt信号与槽的用法,后面再详细解释。通过QtCreator创建一个Qt Widget工程(没有创建ui文件,其它选项为默认值),工程名为SS,最后在SS目录下会生成5个文件:main.cpp、...
  • 学习QT信号槽机制详解 一、Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种...
  • QT信号和槽

    2020-09-18 09:41:58
    一、QT信号槽的概念 类似windows的消息机制 信号函数,只发送不需要知道接收者 槽函数(普通函数),只接收不管通讯 QObject来绑定信号和槽 二、QT信号槽的原理 绑定信号函数和槽函数 调用信号函数(将信号写入...
  • Qt信号阻塞发送

    千次阅读 2019-05-09 10:40:36
    在使用信号关联信号槽函数时,在信号槽后面添加Qt::BlockingQueuedConnection,便可避免连续触发信号时连续响应槽函数问题。 即在槽函数执行完之前再次触发该信号无效 如果关联信号槽时默认为Qt::AutoConnection, ...
  • QT中的信号与槽,就像windows中的消息机制一样,只不过消息机制是用回调函数,而信号与槽代替了函数指针,从而更加的简洁。 信号与槽是Qt的核心机制,一定要弄得清楚明白,它使得不同对象之间能够连接起来,实现...
  •   如果信号发送者和接收者在同一线程,Qt::DirectConnection被使用,否则Qt::QueuedConnection被使用; Qt::DirectConnection   信号发送,信号槽立刻执行。 Qt::QueuedConnection   事件循环返回接收者线程时...
  • Qt::ConnectionType,信号槽连接方式,我们今天来研究下它 Qt::AutoConnection 默认连接方式。如果执行槽函数的对象和信号发出的对象在同一个线程,则为直连接;否则就是队列连接 Qt::DirectConnection 直连接...
  • qt 信号阻塞 和 断开信号

    万次阅读 2018-03-23 17:27:52
    Qt程序中有时候不希望信号槽的触发,在某段流程结束之后,又需要继续回复信号槽状态,这时候可以用阻塞或者断开信号槽的方法来处理。1. 阻塞方法:bool QObject::blockSignals(bool block)qt描述:阻塞模式下,这...
  • Qt信号与槽

    2017-10-10 20:29:50
    信号与槽是一种Qt特有的对象间通信的机制,是Qt区别于其他图形系统的基本特征。信号与槽之间是一种松散的连接关系,这种连接关系可以在程序运行时动态改变,这为Qt编程提供了极大的灵活性。  定义信号使用...
  • QT 信号

    2018-12-20 15:23:24
    QT信号槽机制用起来好用,看起来也比较清晰,随时随处可以绑定自己关系的信号,非常方便。而且提供异步,跨线程使用也很给力。在之前还想把这个机制扩展成一个专门处理任务的异步队列,实验后发现不可行,多次绑定...
  • 使用Qt进行多线程编程的示例 生产者写入数据到缓冲区,当缓冲区写满时再从头开始继续写入覆盖缓冲区。消费者线程读取缓冲区中的数据并写到标准错误输出。 信号量可以具有比互斥锁更高层次的并发。如果访问互斥锁...
  • Qt5 信号-槽内容总结

    2021-02-05 08:29:56
    slots简介信号与槽信号和槽机制是类型安全(type-safe)的信号 Signal槽 SlotsQObject::connect() 函数ConnectionType 参数说明字符串风格的 connect()QMetaMethod风格的 connect()仿函数风格的connect()支持槽为非...
  • Qt信号与槽的机制

    2019-12-09 16:24:26
    connect是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来 将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。当指定信号signal时...
  • 【深入QT信号槽机制浅析

    千次阅读 2014-10-09 20:29:54
    关于QT信号槽的基本概念大家都懂,通过信号槽机制,QT使对象间的通信变得非常简单: A对象声明信号(signal),B对象实现与之参数相匹配的槽(slot),通过调用connect进行连接,合适的时机A对象使用emit把信号带上参数...
  • QT信号槽机制

    2018-07-10 18:31:06
    QT提供了信号槽机制用于完成界面响应的操作,是完成任意两个Qt的对象的通信机制。 其中,信号在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数。 例如,若要将一个窗口部件的变化情况通知给另一个...
  • Qt信号槽分析总结

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

    2013-01-04 03:03:59
    详解QT 信号机制 (上篇) QT 信号机制 是本文要介绍的内容,Qt用预编译器和宏来保证强大的跨平台能力,信号机制则是其中最精妙之处。本文分析了几种常见的信号处理机制,然后详细介绍了Qt的Signal/Slot机制...
  • QT QSerialPort 封装,阻塞方式发送数据后等待读取缓冲区数据结果,使用QT信号量阻塞,线程中初始化串口和读取数据。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,504
精华内容 2,601
关键字:

qt等待信号