QObject::connect()函数使用的几个注意点

一:connect()函数有且只能在QObject类里面和QObject派生类里面使用

connect()函数有且只能在QObject类里面和QObject派生类里面使用,自己新建的类里面(基类不是QObject类和其QObject派生类)使用connect()函数是无效的,编译时一直报错。当然,我们新建工程比如widget,mainwindow,dialog都是QObject的派生类,所以可以直接使用connect()函数,实现信号与槽机制。

类ClassMQTT不是QObject类也不是其派生类时,使用connect()信号与槽机制时,编译会报错,如下图所示:

二:宏定义不能用在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) ); 
    //[…] 
}; 

三:构造函数不能用在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 ) {} // 在槽声明区内声明构造函数不合语法 
    //[…] 
}; 

四: 函数指针不能作为信号或槽的参数。 

例如,下面的例子中将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 *); 
}; 

五:信号和槽不能有缺省参数。 

既然signal->slot绑定是发生在运行时刻,那么,从概念上讲使用缺省参数是困难的。下面的用法是不合理的: 

class SomeClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void someSlot(int x=100); // 将x的缺省值定义成100,在槽函数声明中使用是错误的 
}; 

六:信号和槽也不能携带模板类参数。 

如果将信号、槽声明为模板类参数的话,即使moc工具不报告错误,也不可能得到预期的结果。例如,下面的例子中当信号发射时,槽函数不会被正确调用: 

public slots: 
    void MyWidget::setLocation (pair location); 
public signals: 
    void MyObject::moved (pair location); 

不过,你能使用typedef语句来绕过这个限制。如下所示:

typedef pair IntPair; 
public slots: 
    void MyWidget::setLocation (IntPair location); 
public signals: 
    void MyObject::moved (IntPair location); 

这样使用的话,你就能得到正确的结果。 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值