当前位置:网站首页>Connection mode of QT signal and slot connect() and the return value of emit

Connection mode of QT signal and slot connect() and the return value of emit

2022-04-23 18:15:00 Talent、me

emit signal() The return value of

as everyone knows ,emit It's used when sending signals , We can also use emit Return the return value after the slot function is executed .
as follows :

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;
}

Of course, you can also pass values through function parameters .

The signal is connected to the slot connect() The fifth parameter of

Generally, we ignore the fifth parameter when we write the connection between the signal and the slot , Usually, the default method is to automatically connect parameters ,Qt::connectionType=Qt::AutoConnectType.

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
const QObject *sender,    // Signal sending object pointer 
const char *signal,       // Signal function string , Use SIGNAL()
const QObject *receiver,  // Slot function object pointer 
const char *member,       // Slot function string , Use SLOT()
Qt::connectionType=Qt::AutoConnectType,

Qt::AutoConnection
Auto connect : Default method .

Qt::DirectConnection
Direct connection : It's equivalent to calling slot functions directly .

Qt::QueuedConnection
Queue connection : Through internal postEvent Realized . Not called in real time , Slot functions are always executed in the thread where the slot function object is located . If the signal parameter is a reference type , You will make another copy of . Thread safe .

Qt::BlockingQueuedConnection
Blocking connections : This connection mode can only be used for the thread that signals and The object of the slot function is no longer available in a thread . Through semaphores +postEvent Realized . Not called in real time , Slot functions are always executed in the thread where the slot function object is located . But after the signal , The current thread will block , Wait for the slot function to complete before continuing .

Qt::UniqueConnection
Prevent repeated connections .

Above is connect() Five connection modes , Why suddenly say these five kinds of contact information , Because I used signals and slots in a project connect(), Because the signal and slot are not in the same thread , If you use the default connection method Qt::AutoConnection Words , In different threads, the connection mode will become Qt::QueuedConnection, Will result in the use of emit signal() when , Slot functions are not called in real time , It's the end of execution emit signal(); Statement before executing the contents of the slot function . This leads to if we want to get executed emit signal() The return value of the slot function after the statement , The result is not what we want , So we need to configure the connection mode manually , If the signal and slot are in different threads , And we need to call the slot function in real time , Then you need to configure... In the fifth parameter Qt::BlockingQueuedConnection

 connect(sender, SIGNAL(signal()), receiver, SLOT(slot()),Qt::BlockingQueuedConnection);

版权声明
本文为[Talent、me]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204210610471487.html