簡述
QObject類是所有Qt對象的基類。
QObject是Qt對象模型的核心。 該模型的核心特征是稱為信號和槽
的對象通信機制。 您可以使用connect()將信號連接到槽,並用disconnect()終止該連接。為了避免信號死循環,你可以調用blockSignals()去終止該對象的信號發射。 保護類型函數connectNotify()和disconnectNotify()可以跟蹤連接。
QObjects對象在樹結構中組織起來。當你創建一個QObject對象,以另一個對象作為父對象時,該對象將自動添加到父對象的children()列表中。父類對象擁有子類對象的所有權,即它將在析構函數中自動刪除子類對象。你可以通過findChild()或者findChildren()函數由名稱或者類型查找對象。
每個對象都有一個objectName(),對象的類名也可以通過metaObject::className()獲得。你可以用inherits()函數來判斷對象是否繼承自另外一個類。
當一個對象被刪除時,它會發出一個destroy()信號。 您可以捕獲此信號,以避免對空指針的引用。
QObjects可以通過event()接收事件,也可以過濾其他對象的事件。 有關詳細信息,請參閱installEventFilter()和eventFilter()。
事件在創建對象的線程中傳遞。請注意,對於沒有線程親和性(thread()返回零)的QObject,完全不執行事件處理。使用moveToThread()函數來更改對象及其子對象的線程親和性(如果對象具有父對象則不能被移動)。
請注意,對於實現信號和槽機制或動態對象屬性,Q_OBJECT宏是必需的。你需要在源文件上運行元對象編譯器。我們強烈建議在QObject的所有子類中使用此宏。無論是否使用了信號和槽機制,這樣做避免一些奇怪的行為。
所有Qt Widget都繼承QObject。一個方便的函數isWidgetType()返回一個對象是否是一個Widget。它比qobject_cast <QWidget *>(obj)或obj->inherits("")快很多。
私有屬性
objectName : QString
這個屬性表示對象的名稱,可以用過 objectName()獲取和setObjectName()設置對象的名稱。
信號
void QObject::destroyed(QObject *obj = 0) [signal]
這個信號在對象被銷毀之前發射,並且不能被阻塞。當這個對象銷毀時,其子類對象也跟着銷毀。
槽
void QObject::deleteLater() [slot]
安排對象的銷毀。
當程序返回到創建該對象的消息循環時,刪除該對象。如果調用該函數時,消息循環未運行(例如在 QCoreApplication::exec() 之前對對象調用deleteLater()),則在消息循環啟動之后,該對象被刪除。如果在主消息循環結束之后調用deleteLater()函數,則不會刪除該對象。自從Qt4.8,沒有消息循環的線程中的對象調用deleteLater(), 則在線
程結束后,該對象被銷毀。
請注意,進入和離開新的消息循環(例如,打開一個模態對話框),將不執行延遲刪除。對於要刪除的對象,程序必須返回到調用deleteLater()的消息循環。
注意:多次調用該函數是安全的,因為當第一個延遲刪除函數觸發時,該對象的掛起事件都要從消息隊列中刪除。
函數
A.static function
1.bool QObejct::connect(const QObejct* sender, const char* signal, const QObject* receiver, const char* method, Qt::ConnectionType type =
Qt::AutoConnection) [static]
這個是我們最常見的用來連接信號和槽的函數。如果連接成功返回true,連接失敗返回false。
2.bool QObject::connect(const QObejct* sender, const QMetaMethod & signal, const QObject* receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection) [static]
Qt中QMetaMethod,元方法類,告訴我們這個方法的很多元信息(比如signature(),parameterTypes(),parameterNames())。判斷一個方法是否是元方法
a:元對象系統中(聲明了Q_Obejct宏),一個類中的信號或者槽函數都是元函數。
b: 用Q_INVOKABLE宏聲明,構造函數也用Q_INVOKABLE宏注冊。
3.bool QObject::disconnect(const QObejct* sender, const char* signal, const QObject* receiver, const char* method)
如果信號和槽斷開返回true,否則返回false。
4.bool QObject::disconnect(const QObejct* sender, const QMetaMethod & signal, const QObject* receiver, const QMetaMethod & method)
如果信號和槽斷開返回true,否則返回false。
5.const QMeteObject QObject::staticMetaObject
靜態變量儲存了這個類的元對象。
舉例 QPushButton::staticMetaObject.className() // return "QPushButton"
6.QString QObject::tr(const char *sourceText, const char *disambiguation = 0, int n = -1) [static]
B.protected function
1.void QObject::childEvent(QChildEvent *event) [virtual protected]
這個事件處理函數能在子類重寫,來接收子類的事件。參數就是當前事件。
在添加和刪除子類對象時,QEvent::ChildAdded和QEvent::ChildRemoved事件發送給對象(QEvent::ChildAdded和QEvent::ChildRemoved都是QEvent::Type類型,表示一個事件)。在這兩種情況下,你只能指望子類對象是QObject或者QWidgt類型(因為ChildAdded時,子類對象並未完全構造。在ChildRemoved時,子類對象已經被破壞)。
QEvent::ChildPolished事件發送給窗口,當子類對象被拋光或者拋光的子類對象被添加時。當你接收到拋光事件時,子類對象一般是完全構造好了的,但是這也不能確定。
因為在子類對象構造時,你可能接受到很多的拋光事件。
對於child widget,你總是能接收到一個ChildAdded事件,零個或多個ChildPolished事件,一個ChildRemoved事件。
ChildPolished事件被忽略,當一個對象添加后馬上刪除。如果一個子類對象在構造和析構時,被拋光幾次。你可能接收到同一個子類對象幾次的拋光事件。
2.void QObject::connectNotify(const char * signal) [virtual protected]
對象中的信號,連接到某東西時。該函數被調用。
如果你想比較函數中的參數和一個實際信號。使用QLatin1String()函數和SIGNAL()宏。
if(QLatin1String(signal) == SIGNAL(valueChanged(int))) 比較參數是否是valueChanged(int)信號?
如果信號包含多個參數或者空格參數,在SIGNAL()宏的結果上調用QMetaObject::normalizedSignature()函數。
3.void QObject::customEvent(QEvent *event) [virtual protected]
該事件處理程序能在子類中重寫,來接收自定義事件。自定義的事件要大於QEvent::User(QEvent::User值是1000)。事件被作為參數隨函數傳遞。
4.void QObject::disconnectNotify(const char * signal) [virtual protected]
當信號連接到的某個槽斷開時,調用該虛函數。
5.int QObject::receivers(const char * signal) const [protected]
返回信號的連接數。
6.QObject * QObject::sender() const [protected]
返回對象的指針。信號連接到槽,在槽中調用該函數,返回發射信號的對象的指針。注意:只有在槽中該函數才有用,其他情況下,返回值是0。
7.int QObject::senderSignalIndex() const [protected]
返回信號這個函數的原函數索引。只有在槽中調用才返回正常值,在其他地方調用返回-1。
無論信號是否有參數,該函數總返回帶參數的信號索引。當你對信號重載時,該方法明顯不適用。
8.void QObject::timerEvent(QTimerEvent *event) [virtual protected]
這個事件處理函數能在子類重寫,以接收子類的定時器事件。
QTimer類提供了更高的接口。定時器事件作為參數傳遞。