介面的作用,就是提供乙個與其他系統互動的方法。其他系統無需(也無法)了解內部的具體細節,只能通過對外提供的介面來與進行通訊。純虛函式(包括槽)很容易理解,那麼訊號呢?
在 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 的事件提交...