QT connect函数的用法.docx
《QT connect函数的用法.docx》由会员分享,可在线阅读,更多相关《QT connect函数的用法.docx(16页珍藏版)》请在三一办公上搜索。
1、QT connect函数的用法QT QObject:connect函数的学习 从Qobject(QObject.h)源码中可以看到QObject:connect的定义是这样的: cpp view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *membe
2、r, Qt:ConnectionType = #ifdef qdoc Qt:AutoConnection #else #ifdef QT3_SUPPORT Qt:AutoCompatConnection #else Qt:AutoConnection #endif #endif ); inline bool connect(const QObject *sender, const char *signal, const char *member, Qt:ConnectionType type = #ifdef qdoc Qt:AutoConnection #else #ifdef QT3_SU
3、PPORT Qt:AutoCompatConnection #else Qt:AutoConnection #endif #endif ) const; 其中第二个connect的实现其实只有一句话: cpp view plaincopy 1. return connect(asender, asignal, this, amember, atype); 所以对于connect函数的学习其实就是研究第一个connect函数。 我们在使用connect函数的时候一般是这样调用的: cpp view plaincopy 1. connect(sender,SIGNAL(signal),receiv
4、er,SLOT(slot); 这里用到了两个宏:SIGNAL 和SLOT;通过connect声明可以知道这两个宏最后倒是得到一个const char*类型。 在qobjectdefs.h中可以看到SIGNAL 和SLOT的宏定义: cpp view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. #ifndef QT_NO_DEBUG # define QLOCATION 0_FILE_:QTOSTRING(_LINE_) # define METHOD(a) qFlagLocation(0#a QLOCATION) # define SLOT(a) qFla
5、gLocation(1#a QLOCATION) # define SIGNAL(a) qFlagLocation(2#a QLOCATION) #else # define METHOD(a) 0#a # define SLOT(a) 1#a # define SIGNAL(a) 2#a #endif 所以这两个宏的作用就是把函数名转换为字符串并且在前面加上标识符。 比如:SIGNAL(read)展开后就是2read;同理SLOT(read)展开后就是1read。 cpp view plaincopy 1. 2. connect(sender,SIGNAL(signal),receiver,
6、SLOT(slot); 实际上就是connect(sender,“2signal”,receiver,“1slot)”; 搞明白了实际的参数就可以来看connect的真正实现过程了,在QObject.cpp文件中可以找到connect的实现代码。 cpp view plaincopy 1. 2. 3. 4. 5. bool QObject:connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt:ConnectionType type) 6. const
7、void *cbdata = sender, signal, receiver, method, &type ; if (QInternal:activateCallbacks(QInternal:ConnectCallback, (void *) cbdata) return true; if (sender = 0 | receiver = 0 | signal = 0 | method = 0) qWarning(QObject:connect: Cannot connect %s:%s to %s:%s, sender ? sender-metaObject-className : (
8、null), (signal & *signal) ? signal+1 : (null), receiver ? receiver-metaObject-className : (null), (method & *method) ? method+1 : (null); return false; QByteArray tmp_signal_name; if (!check_signal_macro(sender, signal, connect, bind) return false; const QMetaObject *smeta = sender-metaObject; const
9、 char *signal_arg = signal; +signal; /skip code int signal_index = smeta-indexOfSignal(signal); if (signal_index indexOfSignal(signal); if (signal_index metaObject; int method_index = -1; switch (membcode) case QSLOT_CODE: method_index = rmeta-indexOfSlot(method); break; case QSIGNAL_CODE: method_in
10、dex = rmeta-indexOfSignal(method); break; if (method_index indexOfSlot(method); break; case QSIGNAL_CODE: method_index = rmeta-indexOfSignal(method); break; if (method_index %s:%s, sender-metaObject-className, signal, receiver-metaObject-className, method); return false; int *types = 0; if (type = Q
11、t:QueuedConnection | type = Qt:BlockingQueuedConnectio & !(types = queuedConnectionTypes(smeta-method(signal_index).p79. 80. 81. 82. 83. 84. 85. 86. n) 87. arameterTypes) 88. 89. 90. 91. 92. 93. return false; QMetaObject:connect(sender, signal_index, receiver, method_index, type, const_cast(sender)-
12、connectNotify(signal - 1); return true; types); 上面是去除了debug代码的connect实现。 cpp view plaincopy 1. 2. a) const void *cbdata = sender, signal, receiver, method, &type ; if (QInternal:activateCallbacks(QInternal:ConnectCallback, (void *) cbdat return true; 3. 判断连接是否已经建立。 QInternal:ConnectCallback在qglobal.
13、cpp中实现。 cpp view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. bool QInternal:activateCallbacks(Callback cb, void *parameters) Q_ASSERT_X(cb = 0, QInternal:activateCallback, Callback id must be a valid id); QInternal_CallBackTable *cbt = global_callback_table; if (cbt & cb callbacks.size)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QT connect函数的用法 connect 函数 用法
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3165059.html