关于QObject::connect中函数参数

来源:互联网 发布:医院网络系统 编辑:程序博客网 时间:2024/06/05 04:30

1: 首先要链接的两个类必须继承与QObject,同时添加 Q_OBJECT;


2:在qt中QObject::connect中填写的signal和slot函数,一定要填写参数类型;

因为类中的函数可以,也就是,重载函数名一样,参数不一样,如果QObject::connect中的函数没有参数类型,则无法正确连接;


3: QObject::connect中的signal 和 slot 函数一定要有参数类型, 但是,不可以有参数:

You must use the SIGNAL() and SLOT() macros when specifying the signal and the method, for example:


QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),      label,  SLOT(setNum(int)));
This example ensures that the label always displays the current scroll bar value. Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return false:


// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),  label, SLOT(setNum(int value)));


4:在参数部分,如定义了:typedef unsigned char       BYTE;

//signal:

void  CClass1::setBuf( BYTE * );


//pulic slots:

void CClass2::setBuf(  unsigned char * )

{

    MessageBoxQ( "消息响应" );

}


这样,通常可以用BYTE替换unsigned char ;

但是在QObject::connect(  pClass1, SIGNAL( setBuf( BYTE * )  ),  pClass2, SLOT( setBuf( unsigned char * ) )  );

编译时不会有问题的,但是消息无法响应,


修改方法:

void CClass2::setBuf(  unsigned char * ) 为 void CClass2::setBuf(  BYTE*  )

QObject::connect(  pClass1, SIGNAL( setBuf( BYTE * )  ),  pClass2, SLOT( setBuf( BYTE * ) )  );


可能错误的原因:

SIGNAL 和 SLOT是将其内容转为字符串,

所以,如果消息传递前 函数和参数 是按照字符串严格比较话,那么 “BYTE” 和“unsigned char” 就不同了;

具体原因需要分析源码;


5: 关于  QObject::connect函数声明: QMetaObject::Connectionconnect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)

从这里可以看出: 最后一个参数是设置连接类型,默认参数是Qt::AutoConnection;

Qt::ConnectionType描述:

enum Qt::ConnectionType
This enum describes the types of connection that can be used between signals and slots. In particular, it determines whether a particular signal is delivered to a slot immediately or queued for delivery at a later time.


Constant                    Value                 Description
Qt::AutoConnection     0                  (default) If the signal is emitted from a different thread than the receiving object, the signal is queued, behaving as Qt::QueuedConnection. Otherwise, the slot is invoked directly, behaving as Qt::DirectConnection. The type of connection is determined when the signal is emitted.
Qt::DirectConnection    1                       The slot is invoked immediately, when the signal is emitted.
Qt::QueuedConnection 2                          The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
Qt::BlockingQueuedConnection 3Same as QueuedConnection, except the current thread blocks until the slot returns. This connection type should only be used where the emitter and receiver are in different threads.

 


这里注意:Qt::BlockingQueuedConnection 用于“线程间”阻塞执行;

如果在线程间用Qt::DirectConnection,(Qt::DirectConnection 使用在同一线程中链接作为参数) 虽然会阻塞执行,但是slot函数中如果有UI类的话会提示错误;

如果为默认函数参数,触发消息后,立即执行后面的代码,然后某一时刻再执行slot函数,这样非常不稳定,不安全;

当然还是要根据具体需求设置参数;


6:connect中的常量参数,引用参数,一般参数;


1:  SIGNAL函数, 常量引用参数, SLOT函数的参数一般链接也应该是常量引用参数;如:

signals:
void resultReady( const QString & s);


public slots:

void slot_string( const QString & str )
{
// str = "123";
qDebug()<<str;
}


connect( this, SIGNAL(resultReady(const QString&)), this, SLOT(slot_string(const QString&)) , Qt::DirectConnection);


因为上述是const参数,所以slot中无法修改参数数据;如果想修改数据有两个方法:

(1): 赋值一个新的变量应用;

(2): 修改slot函数参数:


void slot_string( QString str )
{
str = "123";
qDebug()<<str;
}

connect( this, SIGNAL(resultReady(const QString&)), this, SLOT(slot_string(QString)) , Qt::DirectConnection);


注:大部分的Qt的SIGNAL函数都是常量引用参数;


2: SIGNAL函数, 引用参数, SLOT函数的参数也可以是 引用参数 或一般参数;


3:SIGNAL函数和SLOT函数都是一般参数;


说明:

1:这里主要讲的是区别就是在connect的时候,SGNAL ,SLOT的参数在引用于非引用对效率的影响和参数数据的修改;

2:在线程间参数传递的时候,SGNAL和SLOT位于两个不同的线程,如果connect的链接类型是Qt::QueuedConnection非阻塞运行,SLOT的参数是一般参数,那么SLOT函数的参数就是一个数据copy,

在线程emit SGNAL后,如果线程中作为从参数的数据丢失或改变,但是SLOT函数用因为有数据备份,所以SLOT函数中的参数数据不会受到影响;


7:关于connect函数:

connect函数后多种重载方法,常用的有:

1:QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static]

for example:


QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect( scrollBar, SIGNAL(valueChanged(int)),     label,  SLOT(setNum(int)) );


2:

QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type) [static]

Example:


QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect( lineEdit, &QLineEdit::textChanged,   label,  &QLabel::setText );


说明:

建议用方法2,从应用方便讲,

(1):这个方法不需要填写参数类型;

(2):在上述“第6点”中,不论SIGNAL函数和SLOT函数是引用参数或非引用参数,会自动根据实际情况进行参数传递(实参或形参);

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 芝士年糕裂开了怎么办 制作牛肉酱咸了怎么办 腌牛肉太咸了怎么办 八宝粥的拉环断了怎么办 八宝粥易拉罐拉环断了怎么办 吃完辣的胃难受怎么办 天天呆在家很烦怎么办 吃多了荔枝上火怎么办 猛犸牙牌子裂了怎么办 玩游戏电脑卡了怎么办 电脑打开卡在选项界面怎么办? 红警突然卡死怎么办 柯基不吃狗粮怎么办 貔貅嘴巴磕破了怎么办 开光貔貅牙磕了怎么办 玉貔貅鼻子碎了怎么办 开光的貔貅摔坏了怎么办 貔貅摔坏了耳朵怎么办? 貔貅摔坏了一点点怎么办 天猫删评价扣4分怎么办 暴风影音下载电视剧下载不了怎么办 fm2017引援电脑买了怎么办 退休时医保不够二十年怎么办 和的面迟迟不发怎么办 做面条的面发了怎么办 发不起来的面团怎么办 如果婚后买房离婚后财产怎么办 空腹体检前喝水了怎么办 莆田市风俗婴儿死了怎么办后事 上司给你换不好岗位怎么办 领导要把我调走怎么办 美国上庭遇法官退休案子怎么办 夫妻一套房离婚户囗怎么办 正营生不了副团怎么办 浅色衣服被染色了怎么办 解大便解不出来怎么办 强拆挖掘机被村民扣押怎么办 小孩哭的时候接不上气怎么办 昆明市长信箱发不出去怎么办 中国公民在香港想去澳门怎么办 面包车不给贴膜怎么办