yandex俄语网站建设,电销做网站的话术,怎样做网站建设方案,ps做网页设计的尺寸1.宏定义
qt中引入了MOC来反射#xff0c;编译阶段变成 MOC–预处理–编译–汇编–链接
1-1、Q_OBJECT
这个宏定义了一系列代码#xff0c;包括元对象和处理的函数
#define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…1.宏定义
qt中引入了MOC来反射编译阶段变成 MOC–预处理–编译–汇编–链接
1-1、Q_OBJECT
这个宏定义了一系列代码包括元对象和处理的函数
#define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal {}; \QT_ANNOTATE_CLASS(qt_qobject, )
1-2、signal slot emit
从如下得知slot和emit只是作一个修饰而已本身为空没有任何作用signal也只是声明为pulic
#define signal public
#define slot
#define emit1-2、qt4中诞生的SIGANL SLOT
可以看到这两个宏也只是把我们输入的函数转成了字符串后续去匹配
#define SIGANL 2#a
#define SLOT 1#a我们去VS项目–属性–C/C±-预处理器–预处理文件生成选择是 发现预编译后宏展开如下。即验证上述
2.信号槽规则
1.信号的参数可以比槽多反之不行信号槽可以一对一一对多多对一
2.槽函数执行的顺序是按连接时的顺序依次执行的重复connect会导致多次执行
connect(obj, SIGNAL(sig1), this, SLOT(slot1()));
connect(obj, SIGNAL(sig1), this, SLOT(slot2()));
那么sig1发出时先执行槽函数 slot1, 再执行槽函数 slot23.如果用SIGNAL方式connect可以不需要作用域因为上面说过了他把他转为了字符串。目前遇到好处是可以绑定多态信号槽而无需引入派生类文件。坏处是不会进行检查编译时才报warning
qt5的方式connect就需要好处是写代码时就会进行参数匹配检查
4.连接可以被disconnect删除
5.注意connect第五个参数详细可以见QT第五个参数举两个常见例子 在子线程抛出来信号主线程若不绑定为QueuedConnection或BlockingQueuedConnection会接收不到。 如果用BlockingQueuedConnection信号槽不能在同一个线程因为发送完信号后发送者所在线程会阻塞直到槽函数运行完。本来就阻塞了。更别谈槽函数运行了。死锁了
3.connect实现
connect实现代码非常多感兴趣的可以到这里阅读QT5 qobject.cpp 总结下来分为这几步 1.QObject类对象内部维护了一个名为connectionLists的成员变量用于记录信号和槽函数的关联 2.MOC 会在预处理阶段根据 Q_OBJECT 宏生成对应的元对象信息并将这些信息存储在 QObject 类中的一个指针变量中可以通过 QObject::metaObject() 方法获取 3.在发射信号时信号方会生成一个携带信号索引和参数的结构体然后调用 QMetaObject::activate() 方法。QMetaObject::activate() 方法会先根据槽函数所在的类的元对象信息获取该类存储的槽函数索引然后根据索引找到相应的槽函数并调用