QT信号槽的使用

QT4:
     QMetaQbject:: Connection QObject:: connect( const QObject* sender, const char* signal
                                                                                const QObject* receiverconst charslot,
                                                                                Qt:: ConnectionType type = Qt:: AutoConnection)
QT5:
      template< typename PointerToMemberFunction>
     QMetaQbject:: Connection QObject:: connect( const QObject* senderPointerToMemberFunction signal
                                                                                const QObject* receiverPointerToMemberFunction  slot,
                                                                                Qt:: ConnectionType type = Qt:: AutoConnection)
示例:
    QT4:connect(sender, SIGNAL(sigTest(int, double)), receiver, SLOT(slotTest(int, double)))
    QT5:connect(sender, &QObject::sigTest, receiver, &QObject::slotTest);
QT5较QT4在使用上,信号和槽不需要指明参数列表,使用第二种连接方式则要求信号或槽不允许存在同名重载函数

【connect连接方式】

type为连接方式,共五种
  • Qt::AutoConnection:自动连接,默认值。如果sender发送信号和receiver位于不同线程,则使用Qt::QueuedConnection;位于同个线程则使用Qt::DirectConnection
  • Qt::DirectConnection:直连。同个线程上同步执行,emit后的代码将在槽函数执行后继续执行,本质上就是函数调用
  • Qt::QueuedConnection:队列连接。支持跨线程操作,emit后信号会放入队列,接收对象所属线程的事件循环从队列获取信号再执行对应的槽函数
  • Qt::BlockingQueuedConnection:阻塞队列连接。信号发送后当前线程会阻塞,直到槽函数执行完成,禁止在sender和receiver位于同一线程时使用,避免死锁
  • Qt::UniqueConnection:唯一连接。用“|”与其余信号一起使用,指明同一个信号只与同一个槽进行连接,避免多次连接导致调用多次槽函数
注意:QThread对象依附在主线程中,QThread对象的slot函数在主线程中执行,而非QThread管理的子线程。若需在子线程中执行slot函数可以通过moveToThread

【信号槽注意事项】

  • 使用信号槽的类需要继承自Object或其子类,声明需要加上Q_OBJECT(指明头文件xxx.h由moc进行编译,生成moc_xxx.cpp文件)
  • 信号由signals:标明,返回类型只能为void,访问权限默认为public且只能为public
  • 槽函数由slots:标明,返回类型没要求(一般为void),访问权限可以为任意指定,即private slots、protected slots、public slots
  • 信号和槽需要参数一致,参数类型一致,槽函数的参数数量可以少于信号的参数,例如sigTest(int, int, double, string)与slotTest(int, int)可以进行connect
  • 信号只需声明,槽函数声明后须定义

你可能感兴趣的:(QT,qt,开发语言)