QT 信号槽机制

所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽

(使用情况:类需要继承自QObject,并且在类的开头声明Q_OBJECT宏)

QT信号槽->类似于观察者模式

  在信号被发送出来以后,会有对其感兴趣得槽去connect。槽函数自动触发。

QT自带得槽函数:

  按钮等控件有自带得signals,从帮助文档中即可查看。例如:QPushButton::clicked

自定义信号槽:

  注意使用条件。

  1.自定义一个信号

    class{

      siganls:

        void xxxx();      // 可以带参

    }  

 

  2.自定义一个槽函数

  3.connect 链接

  4.emit 信号

  

关于connect的书写格式(QT5--c++11)

  QObject::connect(&newspaper,

          static_cast<void (Newspaper:: *)(const QString &, const QDate &)>(&Newspaper::newPaper),

          &reader,

          &Reader::receiveNewspaper);                                     // 红体字部分是信号带参的参数类型,这种写法可以有效解决QT5信号槽有重载的情况

 

关于connect第五个参数

  如果是在同一线程里面的操作(signalslot都在同一个线程),那么用Qt::DirectConnection的效率最高(使用默认值Qt::AutoConnection也OK),主要是Qt::DirectConnectionQt::QueuedConnection都需要储存到队列。

  如果是多个线程之间进行消息传递(signalslot都在不同线程),那么就要用到Qt::QueuedConnection或者Qt::BlockingQueuedConnection,不过一个是无阻塞的(Qt::QueuedConnection),一个是阻塞的(Qt::BlockingQueuedConnection,发送消息后会阻塞,直到所有的slot都被执行)。

 

posted @ 2021-08-11 17:28  xcn-xcn  阅读(96)  评论(0编辑  收藏  举报