Qt中Signal与Slot参数问题<一>
来源:互联网 发布:上海电信网络套餐介绍 编辑:程序博客网 时间:2024/05/22 00:13
Referenced by:
http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/;
应注意的问题
信号与槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中做到有的放矢,避免产生一些错误。下面就介绍一下这方面的情况。
1 .信号与槽的效率是非常高的,但是同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失,当然这种损失相对来说是比较小的,通过在一台 i586-133 的机器上测试是 10 微秒(运行 Linux),可见这种机制所提供的简洁性、灵活性还是值得的。但如果我们要追求高效率的话,比如在实时系统中就要尽可能的少用这种机制。
2 .信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
3 .如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
4. 宏定义不能用在 signal 和 slot 的参数中。
既然 moc 工具不扩展 #define,因此,在 signals 和 slots 中携带参数的宏就不能正确地工作,如果不带参数是可以的。例如,下面的例子中将带有参数的宏 SIGNEDNESS(a) 作为信号的参数是不合语法的:
#ifdef ultrix #define SIGNEDNESS(a) unsigned a #else #define SIGNEDNESS(a) a #endif class Whatever : public QObject { [...] signals: void someSignal( SIGNEDNESS(a) ); [...] };
5. 构造函数不能用在 signals 或者 slots 声明区域内。
的确,将一个构造函数放在 signals 或者 slots 区内有点不可理解,无论如何,不能将它们放在 private slots、protected slots 或者 public slots 区内。下面的用法是不合语法要求的:
class SomeClass : public QObject { Q_OBJECT public slots: SomeClass( QObject *parent, const char *name ) : QObject( parent, name ) {} // 在槽声明区内声明构造函数不合语法 [...] };
6. 函数指针不能作为信号或槽的参数。
例如,下面的例子中将 void (*applyFunction)(QList*, void*) 作为参数是不合语法的:
class someClass : public QObject { Q_OBJECT [...] public slots: void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法 };
你可以采用下面的方法绕过这个限制:
typedef void (*ApplyFunctionType)(QList*, void*); class someClass : public QObject { Q_OBJECT [...] public slots: void apply( ApplyFunctionType, char *); };
7. 信号与槽不能有缺省参数。
既然 signal->slot 绑定是发生在运行时刻,那么,从概念上讲使用缺省参数是困难的。下面的用法是不合理的:
class SomeClass : public QObject { Q_OBJECT public slots: void someSlot(int x=100); // 将 x 的缺省值定义成 100,在槽函数声明中使用是错误的 };
8. 信号与槽也不能携带模板类参数。
如果将信号、槽声明为模板类参数的话,即使 moc 工具不报告错误,也不可能得到预期的结果。 例如,下面的例子中当信号发射时,槽函数不会被正确调用:
[...] public slots: void MyWidget::setLocation (pair<int,int> location); [...] public signals: void MyObject::moved (pair<int,int> location);
但是,你可以使用 typedef 语句来绕过这个限制。如下所示:
typedef pair<int,int> IntPair; [...] public slots: void MyWidget::setLocation (IntPair location); [...] public signals: void MyObject::moved (IntPair location);
这样使用的话,你就可以得到正确的结果。
9. 嵌套的类不能位于信号或槽区域内,也不能有信号或者槽。
例如,下面的例子中,在 class B 中声明槽 b() 是不合语法的,在信号区内声明槽 b() 也是不合语法的。
class A { Q_OBJECT public: class B { public slots: // 在嵌套类中声明槽不合语法 void b(); [....] }; signals: class B { // 在信号区内声明嵌套类不合语法 void b(); [....] }: };
10. 友元声明不能位于信号或者槽声明区内。
相反,它们应该在普通 C++ 的 private、protected 或者 public 区内进行声明。下面的例子是不合语法规范的:
class someClass : public QObject { Q_OBJECT [...] signals: // 信号定义区 friend class ClassTemplate; // 此处定义不合语法 };
今天在用信号槽的时候遇到一个关于参数的问题:
信号传递的参数是一个指向class A类型的指针,槽函数可以接收到,但是其中这个类中的char*成员会出错,所以想到直接传递A类型的对象,谁知道槽函数根本接收不到,
所以它的参数应该是不能传递类类型的,暂且这么认为,但是char*的成员为什么会出错呢?再看看。
- Qt中Signal与Slot参数问题<一>
- QT中signal和slot
- QT中SIGNAL与SLOT连接的几种方式
- Qt的Signal和Slot机制(一)
- Qt的Signal和Slot机制(一)
- [转载]QT中emit,signal,slot
- qt signal and slot
- QT signal / slot mechanism
- qt slot & signal
- 深入理解QT的SIGNAL\SLOT机制(一):SIGNAL\SLOT如何使用
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- QT程序实例----信号与插槽(signal and slot)
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- Qt 初探信号与槽(signal & slot)
- Qt 的 signal与slot底层实现机制详解
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- CFileDialog 你不知道的秘密
- 江宁地区吃喝玩乐全攻略!
- Android Cursor 泄漏检测
- mfc button 重绘
- A collection of iOS7 animation controllers and interaction controllers, providing flip, fold and all
- Qt中Signal与Slot参数问题<一>
- 软件测试面试 (一) 如何测试一个杯子
- nagios安装使用
- ubuntu 12.04 14.04,14.10 打开windows下txt乱码解决方法!
- 输出星号
- Keytool的使用总结
- Cocos2d-x 动作之创建自定义动作
- mini2440 usb host device controller驱动分析(二) -----数据(urb)的收发流程
- 矩阵连乘问题