QT connect函数的用法文档格式.docx
- 文档编号:19213331
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:14
- 大小:25.37KB
QT connect函数的用法文档格式.docx
《QT connect函数的用法文档格式.docx》由会员分享,可在线阅读,更多相关《QT connect函数的用法文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
)
const;
其中第二个connect的实现其实只有一句话:
1.{
return
connect(asender,
asignal,
this,
amember,
atype);
}
所以对于connect函数的学习其实就是研究第一个connect函数。
我们在使用connect函数的时候一般是这样调用的:
1.connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
这里用到了两个宏:
SIGNAL()和SLOT();
通过connect声明可以知道这两个宏最后倒是得到一个constchar*类型。
在qobjectdefs.h中可以看到SIGNAL()和SLOT()的宏定义:
1.#ifndef
QT_NO_DEBUG
2.#
define
QLOCATION
"
\0"
__FILE__"
QTOSTRING(__LINE__)
3.#
METHOD(a)
qFlagLocation("
0"
#a
QLOCATION)
4.#
SLOT(a)
1"
5.#
SIGNAL(a)
2"
6.#else
7.#
8.#
9.#
10.#endif
所以这两个宏的作用就是把函数名转换为字符串并且在前面加上标识符。
比如:
SIGNAL(read())展开后就是"
2read()"
;
同理SLOT(read())展开后就是"
1read()"
。
2.实际上就是connect(sender,“2signal()”,receiver,“1slot())”;
搞明白了实际的参数就可以来看connect的真正实现过程了,在QObject.cpp文件中可以找到connect的实现代码。
1.bool
QObject:
*method,
type)
4.{
{
void
*cbdata[]
sender,
signal,
receiver,
method,
&
};
if
(QInternal:
activateCallbacks(QInternal:
ConnectCallback,
(void
**)
cbdata))
true;
(sender
==
0
||
receiver
signal
method
0)
qWarning("
connect:
Cannot
connect
%s:
%s
to
%s"
13.
sender
?
sender->
metaObject()->
className()
(null)"
(signal
*signal)
signal+1
receiver->
(method
*method)
method+1
false;
QByteArray
tmp_signal_name;
(!
check_signal_macro(sender,
connect"
bind"
))
QMetaObject
*smeta
metaObject();
*signal_arg
signal;
25.
++signal;
//skip
code
26.
int
signal_index
smeta->
indexOfSignal(signal);
27.
(signal_index
<
28.
//
check
for
normalized
signatures
29.
tmp_signal_name
QMetaObject:
normalizedSignature(signal
-
1);
30.
tmp_signal_name.constData()
+
1;
31.
32.
33.
34.
err_method_notfound(sender,
signal_arg,
35.
err_info_about_objects("
receiver);
36.
37.
38.
39.
40.
tmp_method_name;
41.
membcode
extract_code(method);
42.
43.
check_method_code(membcode,
44.
45.
*method_arg
method;
46.
++method;
skip
47.
48.
*rmeta
49.
method_index
-1;
50.
switch
(membcode)
51.
case
QSLOT_CODE:
52.
rmeta->
indexOfSlot(method);
53.
break;
54.
QSIGNAL_CODE:
55.
indexOfSignal(method);
56.
57.
58.
(method_index
59.
methods
60.
tmp_method_name
normalizedSignature(method);
61.
tmp_method_name.constData();
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
err_method_notfound(receiver,
method_arg,
74.
75.
76.
77.
checkConnectArgs(signal,
method))
78.
Incompatible
sender/receiver
arguments"
79.
\n
-->
80.
className(),
81.
method);
82.
83.
84.
85.
*types
0;
86.
((type
QueuedConnection
BlockingQueuedConnection)
87.
!
(types
queuedConnectionTypes(smeta->
method(signal_index).parameterTypes())))
88.
89.
90.
connect(sender,
signal_index,
method_index,
type,
types);
91.
const_cast<
QObject*>
(sender)->
connectNotify(signal
92.
93.}
上面是去除了debug代码的connect实现。
1.const
2.if
判断连接是否已经建立。
QInternal:
ConnectCallback在qglobal.cpp中实现。
QInternal:
activateCallbacks(Callback
cb,
**parameters)
2.{
Q_ASSERT_X(cb
>
0,
activateCallback()"
Callback
id
must
be
a
valid
id"
QInternal_CallBackTable
*cbt
global_callback_table();
(cbt
cb
cbt->
callbacks.size())
QList<
qInternalCallback>
callbacks
callbacks[cb];
ret
(int
i=0;
i<
callbacks.size();
++i)
|=
(callbacks.at(i))(parameters);
ret;
14.}
QInternal_CallBackTable定义为(qglobal.cpp)
1.struct
QVector<
callbacks;
3.};
qInternalCallback定义为(qnamespace.h)
1.typedef
(*qInternalCallback)(void
**);
这是一个函数指针
返回值是bool,只有一个参数为void**。
这个指针在调用registerCallback加入列表。
1.if
判断signal是否合法。
在QObject.cpp文件中可以找到check_signal_macro的实现
check_signal_macro(const
*func,
*op)
3.{
sigcode
extract_code(signal);
(sigcode
QSIGNAL_CODE)
QSLOT_CODE)
Object:
Attempt
non-signal
func,
op,
signal+1);
else
Use
the
SIGNAL
macro
signal);
15.}
extract的实现也在QObject中,它就是去字符串第一个字符,并且只取低2位的值。
extract_code(const
*member)
extract
code,
ensure
QMETHOD_CODE
QSIGNAL_CODE
(((int)(*member)
'
0'
0x3);
5.}
这里又有两个宏:
QSIGNAL_CODE和QSLOT_CODE。
它们也是在qobjectdefs.h文件中定义的。
1.#ifdef
2.#define
METHOD_CODE
member
codes
3.#define
SLOT_CODE
1
4.#define
SIGNAL_CODE
2
5.#endif
这个定义与之前的SIGNAL和SLOT的定义是对应的。
2.const
3.++signal;
4.int
5.if
16.}
获取signal的索引。
metaObject()是在moc_name.cpp文件中生成的。
1.return
d_ptr->
metaObject
staticMetaObject;
其中staticMetaObject也是在moc文件中定义的
MainWindow:
staticMetaObject
QMainWindow:
staticMetaObject,
qt_meta_stringdata_MainWindow,
qt_meta_data_MainWindow,
4.};
qt_meta_stringdata_MainWindow(具
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QT connect函数的用法 connect 函数 用法
![提示](https://static.bdocx.com/images/bang_tan.gif)