QT 信号与槽connect

QT 信号与槽connect

  • QT 信号与槽connect

    • connect函数调用几个限制
    • connect函数代码

QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义。这里说的是QT5环境下。更详细的介绍可以看这里http://www.devbean.net/2012/12/how-qt-signals-and-slots-work-qt5/

connect函数调用几个限制

  • 1. 信号的发送者必须是QObject的派生类对象。不然会出现error: invalid conversion from ‘XXX*‘ to ‘const QObject*‘ [-fpermissive]...的错误。
  • 2. 回调槽函数的对象必须是QObject的派生类对象。不然会出现error: no matching function for call to ‘QObject::connect(XXX*,的错误。这里要注意一点,信号函数无论存在与否,都不会报错的。但是如果信号的发送者是NULL,那么会在运行的时候提示QObject::connect: Cannot connect (null)::信号函数() to 接收者::槽函数()的问题。
  • 对于1,2两点,在connect函数调用的时候强转类型也可以通过编译,但是运行的时候会提示No such slot QObject::的问题。
  • 3. 槽函数所在的类的定义中必须添加宏Q_OBJECT,不然会出现QObject::connect: No such slot ...的错误。

    这里必须和第2点联系起来,如果添加了Q_OBJECT宏的类不是从QObject派生的,moc生成中间文件的时候会报错Error: Class contains Q_OBJECT macro but does not inherit from QObject

    如果添加了Q_OBJECT宏之后编译出现了undefined reference to ‘vtable for...的错误,请删除build目录下的Makefile文件,再重新生成。

  • 4. 信号函数的signals修饰和槽函数的slots修饰其实是必须的。虽然生成的中间代码中会去除掉。
问题 原因
error: no matching function for call to ‘QObject::connect(XXX*, 信号的发送者和接受者必须是QObject的派生类对象。
QObject::connect: No such slot ... 满足面的条件后,还必须满足槽函数所在类的定义中添加(使用)了Q_OBJECT
Error: Class contains Q_OBJECT macro but does not inherit from QObject 添加了Q_OBJECT宏的类不是从QObject派生的
undefined reference to ‘vtable for... 这是在添加了Q_OBJECT宏之后编译出现,原因是没有更新Makefile文件。请删除build目录下的Makefile文件,再使用qmake重新生成。

connect函数代码

connect是一个模板函数,但是对参数的类型是有要求的。
这个函数的返回值是QMetaObject::Connection类型的。

 1 //Connect a signal to a pointer to qobject member function
 2 //连接一个信号到 qobject 成员函数的指针
 3
 4 template <typename Func1, typename Func2>
 5 static inline QMetaObject::Connection connect(
 6     const typename QtPrivate::FunctionPointer<Func1>::Object *sender,
 7     Func1 signal,
 8     const typename QtPrivate::FunctionPointer<Func2>::Object *receiver,
 9     Func2 slot,Qt::ConnectionType type = Qt::AutoConnection
10     )
11 {
12     typedef QtPrivate::FunctionPointer<Func1> SignalType;
13     typedef QtPrivate::FunctionPointer<Func2> SlotType;
14
15     //检查信号类是否有Q_OBJECT宏
16     Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
17                       "No Q_OBJECT in the class with the signal");
18
19     //compilation error if the arguments does not match.
20     //如果参数不匹配的编译错误。
21     //槽函数需要的参数比信号函数提供多。
22     Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
23                       "The slot requires more arguments than the signal provides.");
24     //信号函数和槽函数的参数不是兼容的。
25     Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
26                       "Signal and slot arguments are not compatible.");
27     //信号函数返回类型是槽函数的不兼容的返回类型。
28     Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
29                       "Return type of the slot is not compatible with the return type of the signal.");
30
31     const int *types = 0;
32     if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
33         types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
34
35     //QObject::connectImpl是用于执行连接的私有内部函数。
36     //槽函数的包装器,用于辅助调用该槽函数。
37     return connectImpl(sender, reinterpret_cast<void **>(&signal),
38                        receiver, reinterpret_cast<void **>(&slot),
39                        new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
40                        typename SignalType::ReturnType>(slot),
41                        type, types, &SignalType::Object::staticMetaObject);
42 }
时间: 2024-10-12 20:49:52

QT 信号与槽connect的相关文章

QT开发(十三)——QT信号与槽机制

QT开发(十三)--QT信号与槽机制 一.QT消息模型 QT封装了具体操作系统的消息机制,遵循经典的GUI消息驱动事件模型. QT定义了与操作系统消息相关的自己的概念,即信号与槽. 信号signal是由操作系统产生的消息. 槽slot是程序中的消息处理函数. connect将系统消息绑定到消息处理函数. 信号到槽的连接必须发生在两个QT对象间. bool QObject::connect ( const QObject * sender, //发生对象 const char * signal,

qt 信号与槽

绑定信号与槽时记得绑定在俩都初始化后.如: #include "ccmychardialog.h" public slots: void ccmyclose(); emit myclose(); #include "dialog.h" public slots: void ccmyclose(); myCCmyCharDialog = new CCmyCharDialog(tcpSocket); //绑定关闭信号与槽 connect(myCCmyCharDialog

【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

Qt是一个跨平台的c++图形用户界面用用程序框架. Qt安装说明: windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行 C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin; linux下需要设置.bash_profile文件 PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin 用root用户登录系统,进入/usr/lib目录后执行 ln libGL

Qt信号与槽自动关联机制

参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exception/article/details/50953005 信号与槽可以通过使用手写代码显式的实现关联 ,也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联. 显示关联 class MyWidget : public QWidget { Q_OBJECT public: M

Qt信号和槽的个人总结

1.connect [cpp] view plaincopy connect(sender,SIGNAL(signal()),receiver,SLOT(slot())); 这里用到了两个宏:SIGNAL() 和SLOT():通过connect声明可以知道这两个宏最后倒是得到一个const char*类型.在qobjectdefs.h中可以看到SIGNAL() 和SLOT()的宏定义: [cpp] view plaincopy #ifndef QT_NO_DEBUG # define QLOCA

关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)

最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定至信号,槽函数的参数列表元素数目只能少于等于信号的参数列表元素数目.而且顺序和类型不能改变.至于缺少的参数应从信号参数尾部开始缺少. 突然今天想起来一个问题,如果一个对象发出信号,将内部的一个成员变量(非简单类型)作为参数向外发送,槽函数就可以接收到这个对象,那么槽函数是否可以完全操作这个对象呢?如

QT 信号和槽链接时注意事项

1.需要继承Qobject . 2.需要有Q_OBJECT宏. 3.如果有多重的继承关系,则每个子类都需要单独写Q_OBJECT宏,不能因为父类有Q_OBJECT宏就省略. 4.继承Qobject的类的声明必须在.h文件中,否则无法产生moc文件,信号和槽的链接就不起作用. 1 class myClass : public QObject 2 { 3 Q_OBJECT 4 public: 5 myClass(){} 6 } 5.信号和槽的链接用 connect函数. //!旧链接方式 编译时不检

Qt信号和槽

GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘.绘制完成.点击鼠标.敲击键盘等.当事件发生时,UI 会产生相应的变化,让用户直观地看到. 大部分编程(例如Win SDK.Web前端)中使用回调函数来响应事件,而 Qt 却独创了信号和槽机制. 所谓回调函数,就是程序员提前定义一个函数,当事件发生时就调用该函数. 信号和槽是 Qt 的核心,它让两个互不相干的对象连接起来,当一个对象的状态改变时,可以通知另一个对象. 我们先通过例子来演示一下信号和槽: 新建一个Qt应用程序 注意,最后一

Qt信号与槽应用实例一

..... connect(m_pGlobelWidget,signal(globeControlClick(object,object)),this,slot(globeControlClick(object,object))) ... signal中是m_pGlobelWidget本身具有的,qt中定义了此信号(有点类似MFC的消息)的触发规则 slot中是响应此信号的槽(对应MFC中的回调函数) 个人认为,Qt作为一种工具只需要在使用学习即可,也没有必要使用比较高大上的UI技术,此工具容易