一、QObject mock
使用QObject mock可以模擬一個QObject對象,在測試階段可以更方便的測試信號的接收和處理。
// 定義mock對象
class MyObjectMock : public QObject
{
Q_OBJECT
public:
MyObjectMock(QObject *parent = nullptr) : QObject(parent) {}
Q_SIGNAL void mySignal();
};
//測試信號的接受
TEST_F(MyTestClass, testSignalReceives)
{
MyObjectMock objectMock;
std::unique_ptr spy(new QSignalSpy(&objectMock, &MyObjectMock::mySignal));
objectMock.mySignal();
EXPECT_EQ(spy->count(), 1);
}
二、Object
QObject是所有Qt對象的基類,因此Qt中的大多數類都是QObject的子類。每個QObject對象都有定位和標識自己的名稱,以及父對象的指針。
QObject的重點是它所具有的信號和槽機制。
一個對象可以發送信號和處理槽。在發出信號時,傳遞給該信號的任何參數都被發送到各個已連接的槽。
三、QObject is an ambiguous
QObject is an ambiguous的原因在於QObject和QObject的派生類之間的互操作,尤其是在嵌入式/實時環境中有時這些互操作問題會變得更加複雜。
解決QObject is an ambiguous的最佳方法是確保所有QObject派生類都按照預期方式構造和銷毀,並相互之間儘可能少的互操作。
四、QObject的生命周期
QObject的生命周期由父-子關係和對象管理構成。一般來講,只有QObject有父對象,非QObject類型則沒有。
當父QObject被銷毀時,它的子對象也被銷毀,當子QObject被銷毀時,它的子對象也被銷毀。
QObject可以通過”對象的父親”進行對象管理,要注意的是下列代碼中實例化的對象並沒有制定parent,因此根據QObject的生命周期規則,該對象的生命周期將由調用者維護;
QObject *foo = new QObject();
五、QObject和線程
QObject的線程關係是通過QThread的線程提供支持。Qt使用一個稱為”Event Loop”的單獨線程來管理QObject,它是一種等待事件並派發它們的機制。
通過線程管理,可以讓QObject對象在不同的線程中運行,來實現多線程處理和並發編程。
代碼示例
// 線程類
class MyThread : public QThread
{
public:
void run() override
{
// 實例化一個MyObject對象
MyObject myObject;
// 移植MyObject到該線程,然後啟動Event Loop
myObject.moveToThread(this);
exec();
}
};
// MyObject定義
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = nullptr) : QObject(parent)
{
// 連接信號和槽
connect(this, SIGNAL(signal()), this, SLOT(slot()));
}
Q_SIGNAL void signal();
Q_SLOT void slot()
{
qDebug() << "MyObject slot called";
}
};
// 測試代碼
TEST_F(MyTestClass, testQObjectThreads)
{
MyThread thread;
thread.start();
QMetaObject::invokeMethod(&myObject, "emitSignal", Qt::QueuedConnection);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283330.html
微信掃一掃
支付寶掃一掃