emit signal()的返回值
众所周知,emit是发送信号时用的,我们还可以使用emit 传回槽函数执行完的返回值。
如下:
class testOne : public QDialog
{
Q_OBJECT
public:
explicit testOne(QWidget *parent = nullptr);
~testOne();
signals:
bool isFlag();
private:
testTwo testObject;
public slots:
};
testOne::testOne(QWidget *parent) :
QDialog(parent)
{
connect(this, SIGNAL(isFlag()), testObject, SLOT(retFlag()),Qt::BlockingQueuedConnection);
bool flag = emit isFlag();
if(flag==true){
qDebug()<<"Success!";
}else{
qDebug()<<"Fail!";
}
}
class testTwo : public QDialog
{
Q_OBJECT
public:
explicit testTwo(QWidget *parent = nullptr);
~testTwo();
private:
public slots:
bool retFlag();
};
bool testTwo::retFlag()
{
return true;
}
当然也可以通过函数参数传值。
信号与槽连接connect()的第五个参数
一般我们写信号与槽的连接关系都会忽略第五个参数,通常默认的方式就是自动连接参数,Qt::connectionType=Qt::AutoConnectType。
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
const QObject *sender, //信号发送对象指针
const char *signal, //信号函数字符串,使用SIGNAL()
const QObject *receiver, //槽函数对象指针
const char *member, //槽函数字符串,使用SLOT()
Qt::connectionType=Qt::AutoConnectType,
Qt::AutoConnection
自动连接:默认的方式。
Qt::DirectConnection
直接连接:相当于直接调用槽函数。
Qt::QueuedConnection
队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。线程安全的。
Qt::BlockingQueuedConnection
阻塞连接:此连接方式只能用于信号发出的线程 和 槽函数的对象不再一个线程中才能用。通过信号量+postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。但是发出信号后,当前线程会阻塞,等待槽函数执行完毕后才继续执行。
Qt::UniqueConnection
防止重复连接。
以上是connect()五种的连接方式,为什么要突然说这五种联系方式尼,因为我在一个项目中使用到了信号与槽connect(),因为信号与槽不在同一个线程中,如果使用默认的连接方式Qt::AutoConnection的话,在不同的线程中连接方式就会变成了Qt::QueuedConnection, 就会导致在使用emit signal()时,槽函数并不是实时调用,而是执行完emit signal();语句后才去执行槽函数的内容。 这导致如果我们想获取执行完emit signal()语句后槽函数的返回值,结果就不是我们想要的了,所以需要我们手动去配置连接方式,如果在信号和槽在不同线程中,而且我们需要实时的调用槽函数,那么需要在第五个参数中配置Qt::BlockingQueuedConnection
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()),Qt::BlockingQueuedConnection);