Qt信号和槽connet()函数
参考文章1
参考文章2
一、简述
Connect()函数将信号与槽关联起来。
函数原型:
//参数:信号对象,信号,槽对象,槽函数,连接方式
static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection);inline QMetaObject::Connection connect(const QObject *sender, const char *signal,const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;
示例:
QPushButton *btn = new QPushButton;// 方式一:老式写法//注意:对于宏SINGNAL和SLOT,它们能将参数转化为const char*类型connect(btn, SIGNAL(clicked()), this, SLOT(close()));// 方式二:Qt5后新写法connect(btn, &QPushButton::clicked, this, &MainWindow::close);// 方式三:lambda表达式connect(btn, &QPushButton::clicked, this, [&]() {this->close();});
其中,第五个参数的用法:
- Qt::AutoConnection:默认值,使用这个值则连接类型会信号发送时决定。如果接收者和发送者在同一个线程,则自动调用Qt::DirectConnection类型。如果接收者和发送者不在同一个线程内,则自动调用Qt::QueuedConnection类型。
- Qt::DirectConnection:槽函数会在信号发送时直接被调用,槽函数运行于信号发送者所在的线程。效果看上去就像是直接在信号发送的位置调用了槽函数。这个用法在多线程环境下比较危险,可能会造成程序崩溃。
- Qt::QueuedConnection:槽函数在控制回到接收者所在的线程的事件循环时被调用,槽函数运行于信号接收者所在的线程。信号发出后,槽函数不会立刻调用,等接收者的当前线程执行完,进入事件循环之后,槽函数才会被调用。一般在多线程情况下调用这个。
- Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一样,不过不同的是,信号发出后,发送者线程会阻塞,知道函数执行完。接收者和发送者绝对不能在同一个线程,否则会导致程序死锁。一般用于多线程同步。
- Qt::UniqueConnection:这个flag可以通过按位或(|)和以上四个结合在一起使用。当这个flag被设置时,当某个信号和槽已经连接时,再进行重复连接就会失败,避免了重复连接。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
