利用Qt進行介面間通訊

2021-09-20 11:47:44 字數 4125 閱讀 2054

介面的作用,就是提供乙個與其他系統互動的方法。其他系統無需(也無法)了解內部的具體細節,只能通過對外提供的介面來與進行通訊。

純虛函式(包括槽)很容易理解,那麼訊號呢?

在 qt 中,定義乙個純虛訊號有效嗎?

的確,這個話題非常有意思。。。通常,我們會定義一些純虛的槽函式,但關於純虛訊號這個話題討論的比較少!那麼,訊號可不可以是純虛的呢?

關於訊號和純虛,我們知道:

訊號沒有實現,如果將其宣告為純虛的,需要繼承的類來提供乙個實現,這與「訊號沒有實現」直接衝突。就好比讓乙個人同時出現在兩個地方,這是不可能的。因此,似乎宣告乙個純虛訊號是乙個錯誤。

在編寫完乙個介面時,為了能使用 qt 的訊號槽特性,很多人可能會寫出類似下面的**:

很遺憾,qt 發出了警告:

warning: signals cannot be declared virtual

那麼,如何解決這個問題呢?

下面,列出三種解決方案:

測試效果如下:

不讓用virtual,好吧,那就不用了,這算是最簡單的解決方式!

#ifndef clock_h

#define clock_h

#include

class iclock : public qobject

virtual

void dosomething() = 0;

signals:

void alarm();

};#endif // clock_h

具體的實現也與訊號無關了,只需要實現其他介面即可:

#ifndef digital_clock_h

#define digital_clock_h

#include "clock.h"

#include

#include

class

digitalclock : public

iclock

void dosomething()q_decl_override

};#endif // digital_clock_h

但是這種方式並不算理想,因為一般來說,介面是乙個簡單的 c++ 類,不需要派生自qobject

將「訊號」定義為乙個純虛函式:

#ifndef clock_h

#define clock_h

class iclock

virtual

void dosomething() = 0;

// 不是乙個訊號(但可以當做訊號來用),因為 iclock 不是 qobject

virtual

void alarm() = 0;

};#endif // clock_h

注意:對於iclock來說,alarm()只是乙個純虛函式,並不是乙個「訊號」(但可以當做訊號來用),因為iclock不是qobject

由於需要訊號支援,所以具體實現需要派生自qobject。此外,還需要將alarm()定義為signals

#ifndef digital_clock_h

#define digital_clock_h

#include "clock.h"

#include

#include

class

digitalclock : public

qobject, public

iclock

void dosomething()q_decl_override

signals:

// 實現由 moc 來完成

void alarm() q_decl_override;

};#endif // digital_clock_h

這時,alarm()的具體的實現在內部是由moc來完成的。

為了測試是否有效,再定義乙個類 -monitor.h

#ifndef monitor_h

#define monitor_h

#include

#include

#include "clock.h"

class monitor : public qobject

public:

void monitoralarm(iclock *clock) else

}};#endif // monitor_h

注意:連線訊號時,需要將其轉換為qobject

main.cpp中進行測試:

#include "digital_clock.h"

#include "monitor.h"

int main(int argc, char *ar**)

除了上述方式之外,還可以在介面中定義訊號槽的連線方式。

首先,定義乙個連線訊號槽的介面 -connecttoalarm()

#ifndef clock_h

#define clock_h

#include

class iclock

virtual

void dosomething() = 0;

virtual

bool connecttoalarm(qobject *receiver, const

char *pszslot, bool isconnect) const = 0;

};#endif // clock_h

然後,在派生類中實現訊號槽的具體連線:

#ifndef digital_clock_h

#define digital_clock_h

#include "clock.h"

#include

#include

class digitalclock : public qobject, public iclock

void dosomething() q_decl_override

bool connecttoalarm(qobject *receiver, const

char *pszslot, bool isconnect) const q_decl_override

signals:

void alarm();

};#endif // digital_clock_h

這樣以來,連線方式就變得簡單多了。

#ifndef monitor_h

#define monitor_h

#include

#include

#include "clock.h"

class monitor : public qobject

public:

void

monitoralarm(iclock *clock) else

}};#endif // monitor_h

除了訊號槽之外,qt 還可以通過事件機制(sendevent()postevent())來實現介面之間的通訊。正如上所示,只要通過介面來獲得qobject即可。

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...

QT 執行緒間通訊

在 qt 系統中,執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中有一種從非主事件執行緒中將事件提交給乙個物件的方法,也就是 qthread postevent 方法,該方法提供了qt 中的一種 thread safe 的事件提交...