自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

初識(shí)Qt Object 類

移動(dòng)開發(fā)
QObject類是所有Qt對(duì)象的基類,QObject是Qt對(duì)象模型的中心。這個(gè)模型的中心特征就是一種用于無縫對(duì)象通訊的被叫做信號(hào)和槽的非常強(qiáng)大的機(jī)制。

本文介紹Qt Object 類,QObject把它們自己組織在對(duì)象樹中。當(dāng)你創(chuàng)建一個(gè)QObject作為其它對(duì)象的父對(duì)象,這個(gè)對(duì)象會(huì)在父對(duì)象中自動(dòng)調(diào)用insertChild()并且可以在父對(duì)象的children()列表中顯示出來。父對(duì)象擁有這個(gè)對(duì)象,比如,它將在它的析構(gòu)函數(shù)中自動(dòng)刪除它的孩子。你可以使用child()或者queryList()通過名稱和任意的類型來查找一個(gè)對(duì)象,并且使用objectTrees()來獲得樹根的列表。

QObject類介紹

QObjectQt對(duì)象模型的中心。這個(gè)模型的中心特征就是一種用于無縫對(duì)象通訊的被叫做信號(hào)和槽的非常強(qiáng)大的機(jī)制。你能夠使用connect()把信號(hào)和槽連接起來并且可以用disconnect()來破壞這種連接。為了避免從不結(jié)束的通知循環(huán),你可以調(diào)用blockSignals()臨時(shí)地阻塞信號(hào)。保護(hù)函數(shù)connectNotify()和disconnectNotify()使跟蹤連接成為可能。

QObject把它們自己組織在對(duì)象樹中。當(dāng)你創(chuàng)建一個(gè)QObject作為其它對(duì)象的父對(duì)象,這個(gè)對(duì)象會(huì)在父對(duì)象中自動(dòng)調(diào)用insertChild()并且可以在父對(duì)象的children()列表中顯示出來。父對(duì)象擁有這個(gè)對(duì)象,比如,它將在它的析構(gòu)函數(shù)中自動(dòng)刪除它的孩子。你可以使用child()或者queryList()通過名稱和任意的類型來查找一個(gè)對(duì)象,并且使用objectTrees()來獲得樹根的列表。

每個(gè)對(duì)象都有一個(gè)對(duì)象名稱(name()),能夠報(bào)告它的類名(className())并且它在QObject繼承層次中是否繼承了另一個(gè)類(inherits())。

當(dāng)對(duì)象被刪除時(shí),它發(fā)射destroyed()信號(hào)。你可以捕獲這個(gè)信號(hào)來避免對(duì)QObject的搖擺引用。QGuardedPtr類提供了一種文雅的方式來使用這個(gè)機(jī)制。
QObject可以通過event()接收事件并且過濾其它對(duì)象的事件。詳細(xì)情況請(qǐng)參考installEventFilter()和eventFilter()。一個(gè)方便的處理者,childEvent(),能夠被重新實(shí)現(xiàn)來捕獲子對(duì)象事件。

最后但不是最不重要的一點(diǎn),QObject提供了Qt中最基本的定時(shí)器,關(guān)于定時(shí)器的高級(jí)支持請(qǐng)參考QTimer。

注意Q_OBJECT宏對(duì)于任何實(shí)現(xiàn)信號(hào)、槽和屬性的對(duì)象都是強(qiáng)制的。你也需要對(duì)源文件運(yùn)行moc程序(元對(duì)象編譯器)。我們強(qiáng)烈建議在QObject的所有子類中使用這個(gè)宏,而不管它是不是實(shí)際使用了信號(hào)、槽和屬性,因?yàn)椴贿@樣做也許會(huì)導(dǎo)致普通函數(shù)會(huì)出現(xiàn)為定義的問題。

所有的Qt窗口部件繼承了QObject。方便的函數(shù)isWidgetType()返回這個(gè)對(duì)象實(shí)際上是不是一個(gè)窗口部件。它比inherits( “QWidget” )快得多。

一些QObject函數(shù),比如children()、objectTrees()和queryList()返回一個(gè)QObjectList。QObjectList是QObject的QPtrList。QObjectLists支持像QPtrLists同樣的操作并且又一個(gè)迭代器類QObjectListIt。也可以參考對(duì)象模型。

QObject 幾個(gè)重要的成員函數(shù)

1、排第一位的當(dāng)然是信號(hào)的綁定connect

  1. bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) 

[靜態(tài)]

把從sender對(duì)象發(fā)送的signal和receiver對(duì)象中的member連接起來,并且如果連接成功返回真,否則返回假。

你必須在說明signal和member的時(shí)候使用SIGNAL()和SLOT()兩個(gè)宏,例如:

  1. QLabel     *label  = new QLabel;  
  2. QScrollBar *scroll = new QScrollBar;  
  3. QObject::connect( scroll, SIGNAL(valueChanged(int)),  
  4.                   label,  SLOT(setNum(int)) ); 

這個(gè)實(shí)例確保了label總顯示當(dāng)前滾動(dòng)條的值。

一個(gè)信號(hào)也可以被連接到另一個(gè)信號(hào)上:

  1. class MyWidget : public QWidget  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     MyWidget();  
  6. signals:  
  7.     void myUsefulSignal();  
  8. private:  
  9.     QPushButton *aButton;  
  10. };  
  11. MyWidget::MyWidget()  
  12. {  
  13.     aButton = new QPushButton( this );  
  14.     connect( aButton, SIGNAL(clicked()), SIGNAL(myUsefulSignal()) );  

在這個(gè)實(shí)例中,MyWidget的構(gòu)造函數(shù)傳遞一個(gè)來自私有成員變量的信號(hào),并且使它在MyWidget的一個(gè)相關(guān)名稱下可用。一個(gè)信號(hào)可以被連接到多個(gè)槽和信號(hào)上。多個(gè)信號(hào)可以被連接到一個(gè)槽上。如果一個(gè)信號(hào)被連接到幾個(gè)槽上,當(dāng)信號(hào)被發(fā)射的時(shí)候,槽被激活的順序是任意的。如果信號(hào)和槽被成功連接,返回真。如果它不能創(chuàng)建連接,返回假,例如,如果QObject不能檢驗(yàn)signal或member的存在,或者如果它們的標(biāo)簽不協(xié)調(diào)。也可以參考disconnect()。

#p#

有涉及多線程的需要注意它的第5個(gè)參數(shù):

enum Qt::ConnectionType

This enum describes the types of connection that can be used between signals and slots. In particular, it determines whether a particular signal is delivered to a slot immediately or queued for delivery at a later time.

初識(shí)Qt Object 類

With queued connections, the parameters must be of types that are known to Qt’s meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes. If you try to use a queued connection and get the error message:

2、和connect 成雙成對(duì)的disconnect

取消從sender對(duì)象發(fā)送的signal和對(duì)象receiver中的member的連接。

當(dāng)這兩個(gè)有關(guān)對(duì)象中的一個(gè)被銷毀時(shí),這個(gè)信號(hào)——槽連接就被移除了。

disconnect()通常被用在三種方式下,正如下面的例子所描述的。

1. 取消連接到一個(gè)對(duì)象的信號(hào)的任何事物:

  1. disconnect( myObject, 0, 0, 0 ); 

等于非靜態(tài)重載函數(shù)

  1. myObject->disconnect(); 

2. 取消連接到一個(gè)特定信號(hào)的任何事物:

  1. disconnect( myObject, SIGNAL(mySignal()), 0, 0 ); 

等于非靜態(tài)重載函數(shù)

  1. myObject->disconnect( SIGNAL(mySignal()) ); 

3. 取消一個(gè)特定接收者的所有連接:

  1. disconnect( myObject, 0, myReceiver, 0 ); 

等于非靜態(tài)重載函數(shù)

  1. myObject->disconnect( myReceiver ); 

0可以用做一個(gè)通配符,意義可能分別為“任何信號(hào)”、“任何接受對(duì)象”或者“一個(gè)接受對(duì)象中的任何槽”。

sender不能為0。(你不能在一個(gè)調(diào)用中取消來自多于一個(gè)對(duì)象的信號(hào)的連接。)

如果signal為0,它取消所有和這個(gè)對(duì)象的信號(hào)連接的receiver和member。如果不是,只由特定信號(hào)被取消聯(lián)接。

如果receiver為0,它取消連接到signal的任何事物。如果不是,只有receiver中的槽被取消連接。

如果member為0,它取消連接到receiver的任何事物。如果不是,只有名為member的槽被取消聯(lián)接并且其它所有槽被保留。如果receiver被省去,member必須為0,所以你不能取消所有對(duì)象中同一特定名稱槽的連接。

#p#

3、installEventFilter的使用
void QObject::installEventFilter ( const QObject * obj )
安裝事件過濾器obj到這個(gè)對(duì)象。

事件過濾器就是接收所有被發(fā)送到這個(gè)對(duì)象的事件的對(duì)象。這個(gè)過濾器可以停止事件或者把它再轉(zhuǎn)給這個(gè)對(duì)象。事件過濾器obj通過它的eventFilter()函數(shù)來接收事件。如果事件被過濾了(比如,停止了),eventFilter()函數(shù)必須返回真,否則它必須返回假。

如果有多個(gè)事件過濾器被安裝到同一個(gè)對(duì)象上,最后一個(gè)被安裝的事件過濾器將先被激活。

實(shí)例:

  1. #include <qwidget.h> 
  2.  
  3. class MyWidget : public QWidget  
  4. {  
  5.     Q_OBJECT  
  6. public:  
  7.     MyWidget( QWidget *parent = 0, const char *name = 0 );  
  8.  
  9. protected:  
  10.     bool eventFilter( QObject *, QEvent * );  
  11. };  
  12.  
  13. MyWidget::MyWidget( QWidget *parent, const char *name )  
  14.     : QWidget( parent, name )  
  15. {  
  16.     // 為父對(duì)象(如果有的話)安裝一個(gè)過濾器  
  17.     if ( parent )  
  18.         parent->installEventFilter( this );  
  19. }  
  20.  
  21. bool MyWidget::eventFilter( QObject *o, QEvent *e )  
  22. {  
  23.     if ( e->type() == QEvent::KeyPress ) {  
  24.         // 對(duì)于鍵被按下進(jìn)行特殊處理  
  25.         QKeyEvent *k = (QKeyEvent *)e;  
  26.         qDebug( "Ate key press %d", k->key() );  
  27.         return TRUE; // 吃掉了這個(gè)事件  
  28.     } else {  
  29.         // 標(biāo)準(zhǔn)事件處理  
  30.         return QWidget::eventFilter( o, e );  
  31.     }  
  32. }  

例如,QAccel類使用這種技術(shù)來截取快捷鍵被按下。

警告:如果在你的eventFilter()函數(shù)中你刪除了接收對(duì)象,請(qǐng)確認(rèn)返回真。否則,Qt會(huì)把這個(gè)事件轉(zhuǎn)給被刪除的對(duì)象并且程序也許會(huì)崩潰。

4、tr國際化使用

  1. QString QObject::tr ( const char * sourceText, const char * comment ) const  

返回sourceText的翻譯版本,或者如果沒有合適的版本返回sourceText它自己。翻譯上下文是comment的QObject(默認(rèn)為空)。所有使用Q_OBJECT宏的QObject對(duì)象有這個(gè)函數(shù)的重新實(shí)現(xiàn),把子類名作為上下文。

小結(jié):Qt Object 類介紹完了,并了解了QObject類是所有Qt對(duì)象的基類,QObjectQt對(duì)象模型的中心。QObject也是很常用的一個(gè)大類希望本文對(duì)你有幫助,

【編輯推薦】

新手須知 QT類大全

淺談Qt中多線程編程

解析 QT 靜態(tài)庫和動(dòng)態(tài)庫

Qt中實(shí)現(xiàn)QThread線程同步QFtp

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-01 16:04:45

Qt Python

2011-06-14 14:41:14

Python Qt

2011-06-16 11:28:48

Qt QApplicati

2022-06-08 10:46:00

CSS前端

2011-06-16 11:04:07

Qt

2011-06-14 15:28:44

QT

2009-08-31 18:46:05

繼承System.Ob

2011-06-15 10:49:26

Qt QTableItem

2011-07-04 16:12:00

QT QWidget

2011-06-16 11:13:13

QtQWidget

2011-06-30 11:23:29

Qt 線程

2009-08-20 18:21:04

GetType方法C# object類

2011-06-22 15:24:50

Qt 線程

2011-07-04 14:00:11

QT QEvent

2009-12-16 09:43:35

Ruby父類Objec

2011-06-24 14:17:58

Qt 容器類 QVector

2011-06-24 15:06:40

QT

2011-06-30 16:38:07

Qt QTableWidg

2011-06-22 09:58:04

QT 集合類

2015-07-27 09:25:45

core data
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)