一、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