QT学习从入门到入门 step by step (7)

关于QObject::Connect() 函数的参数 --- (转贴)本文来自 chinabinlang 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/chinabinlang/article/details/16921531?utm_source=copy

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                  自动,即信号与槽同线程时直接调用,异线程时排队
Qt::DirectConnection    1                 直接调用 (同步)
Qt::QueuedConnection 2                排队调用(异步)          
Qt::BlockingQueuedConnection 3  与队列连接相同,除了当前线程阻塞,直到时隙返回为止。

                                                        这种连接类型只应用于发射器和接收器处于不同线程中的位置。

这里注意: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函数是引用参数或非引用参数,会自动根据实际情况进行参数传递(实参或形参);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值