[Qt] Qt信号槽

信号槽是Qt的核心机制之一,信号槽简单的来说就是两个对象及两个对象问答行为。

例如:发送者(Sender)发出信号(SIGNAL)、接收者(Receiver)做出反应(SLOT)。利用connect函数将这两个对象及其行为联系起来。

一个简单的例子如下,创建一个button,Clicked button make app quit.

#include <QApplication>
#include <QPushbutton>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);

    // Create a button.
    QPushButton button("QUIT");

    // Connect signal and slot
    QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);

    // Show button in the screen.
    button.show();

    return a.exec();
}

connect函数的一般形式为:

connect(sender, signal, receiver, slot);

当sender发出signal信号后,receiver的slot函数会自动调用。

其中sender和receiver没有区别,都是QObject指针,主要区别在于signal和slot

signal和slot要求参数类型一致,如果不一致,则允许slot的参数比signal少,但是存在的参数必须对应一致。

时间: 2024-08-29 14:31:03

[Qt] Qt信号槽的相关文章

非Qt工程使用Qt的信号槽机制

非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.

在非UI线程中更改UI(Delphi使用隐藏窗口来处理,QT使用信号槽)

在Delphi里我记得是使用TThread.Synchronize(TThreadMethod),原理是利用了一个隐藏窗口来处理. 在QT Debug模式一下,碰到了同样的问题,显示错误: cannot send events to objects owned by a different thread 解决方案是使用信号槽,就是在线程里不断的发信号,UI线程的槽函数不断的接受信号并做处理: So as a solution I would propose the following: Defi

Qt之信号槽连接——基于字符串与基于函数的连接之间的不同(译)

从Qt5.0开始,Qt提供了两种不同的方式进行信号槽的连接:基于字符串的连接语法.基于函数的连接语法.这两种连接语法各有利弊,下面的表总结了它们的不同点. 下面几部分详细解释了它们之间的不同,并且说明对于每种连接语法如何使用各自的优点. 类型检查以及隐式类型转换 基于字符串的连接是在运行时通过字符串比较来进行类型检查,这种方式有3个局限性: 1.只有在程序运行后才能查出连接错误: 2.信号和槽之间不能进行隐式转换: 3.类型定义和名字空间不能被识别. 第2第3个局限存在的原因是,字符串的比较并不

Qt Connect 信号 槽

信号和槽机制是 QT 的核心机制 .信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方.信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码.  在QT中,connect()函数是关联部件的动作与执行的函数. 在启动函数中进行设置

qt多线程信号槽传输方式

//简单介绍一下QT信号与槽的连接方式:    //Qt::AutoConnection表示系统自动选择相应的连接方式,如果信号与槽在同一线程,就采用Qt::DirectConnection, //如果信号与槽不在同一线程,将采用Qt::QueuedConnection的连接方式.     //Qt::DirectConnection表示一旦信号产生,立即执行槽函数.     //Qt::QueuedConnection表示信号产生后,将发送Event给你的receiver所在的线程,postE

Qt的信号槽,一个老MFC的经验

最近在利用闲暇时间研究Qt,大概有3周了,看过了官网的white paper并浏览了一遍<C++ GUI Programming with Qt 4, 2nd Edition>.总的来说,感触还是很深的,所以今天想写点东西,作为对Qt初体验的记录. 本人作为一个MFC老古董(如果你关注本博的话,你是知道的,汗-),发现研究Qt是一件非常令人赏心悦目的事情.那感觉,就像你逛完了集美家具城看到一堆国产风格的家具后突然走进宜家的卖场一样.我并不是说宜家的家具有多么好,只不过宜家家具代表的北欧风格和家

Qt中信号槽connect的多种类型

QObject::connect只有4个参数吗?其实不是,请看它的定义:QObject::connect(sender, signal, receiver, method, Qt::ConnectionType type = Qt::AutoConnection)可见实际它有5个参数,只是最后一个参数有默认值,所以平常使用时很少触及.前4个参数都很熟悉,第五个参数是一个enum Qt::Connection Type类型的,它一共有六个值,下面是Qt Assistant中给出的明确说明: Thi

Qt 学习之路 :信号槽

信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号.也就是说,当信号发出时,被连接的槽函数会自动被回调.这就类似观察者模式:当发生了感兴趣的事件

Qt开发之信号槽机制

一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSignal(); void customSignal(int i) public slots: void customSlot(); void customSlot(int i); }; 2.宏与MOC源对象 摘录代码: // qobjectdefs.h i. … ii. #define slots iii

Qt::浅谈信号槽连接,参数在多线程中的使用

Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Qt::DirectConnection,如果不是则等于Qt::QueuedConnection Qt::DirectConnection:直接连接方式,简单说就是直接调用,信号发送会在槽函数执行完毕后返回,但前提是信号和槽的对象必须在同一线程中,否则会出现未知错误 Qt::QueuedConnect