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: 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 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: public slots: void slot_string( const QString & 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 ) 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:
2: QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type) [static] Example: 说明: 建议用方法2,从应用方便讲, (1):这个方法不需要填写参数类型; (2):在上述“第6点”中,不论SIGNAL函数和SLOT函数是引用参数或非引用参数,会自动根据实际情况进行参数传递(实参或形参); |
|