?? properties.html
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/object.doc:208 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>屬性</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">主頁</font></a>
| <a href="classes.html">
<font color="#004faf">所有的類</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的類</font></a>
| <a href="annotated.html">
<font color="#004faf">注釋的類</font></a>
| <a href="groups.html">
<font color="#004faf">分組的類</font></a>
| <a href="functions.html">
<font color="#004faf">函數(shù)</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>屬性</h1>
<p> Qt提供了一套和一些編譯器提供商也提供的屬性系統(tǒng)類似的完善的屬性系統(tǒng)。然而,作為一個(gè)不依賴編譯器和平臺(tái)的庫,Qt不能依賴像<tt>__property</tt>或者<tt>[property]</tt>那樣的非標(biāo)準(zhǔn)編譯器特征。我們的解決方案可以在我們支持的每一個(gè)平臺(tái)上和<em>任何</em>標(biāo)準(zhǔn)的C++編譯器一起工作。它基于元對(duì)象系統(tǒng),元對(duì)象系統(tǒng)也通過<a href="signalsandslots.html">信號(hào)和槽</a>提供對(duì)象通訊。
<p> 在類聲明中的<tt>Q_PROPERTY</tt>宏聲明了一個(gè)屬性。屬性只能在繼承于<a href="qobject.html">QObject</a>的子類中聲明。第二個(gè)宏,<tt>Q_OVERRIDE</tt>,可以用來覆蓋一些子類中由繼承得到的屬性。
<p> 對(duì)于外面的世界,屬性看起來和一個(gè)數(shù)據(jù)成員非常類似。然而,屬性和普通的數(shù)據(jù)成員還是有一下一些不同點(diǎn):
<p> <ul>
<li> 一個(gè)讀函數(shù)。這是一直存在的。
<p> <li> 一個(gè)寫函數(shù)。這個(gè)是可選的:像<a href="qwidget.html#isDesktop">QWidget::isDesktop</a>()這樣的只讀的屬性就沒有寫函數(shù)。
<p> <li> “存儲(chǔ)”特征需要說明持續(xù)性。絕大多數(shù)屬性是被存儲(chǔ)的,但是有一小部分的虛擬屬性卻不用。舉個(gè)例子,<a href="qwidget.html#minimumWidth">QWidget::minimumWidth</a>()是不用存儲(chǔ)的,因?yàn)樗皇?lt;a href="qwidget.html#minimumSize">QWidget::minimumSize</a>()的一種查看,沒有自己的數(shù)據(jù)。
<p> <li> 一個(gè)復(fù)位函數(shù)用來把屬性設(shè)置回它根據(jù)上下文的特定缺省值。這個(gè)用法還是比較罕見的,但是舉個(gè)例子,<a href="qwidget.html#font">QWidget::font</a>()需要這個(gè)函數(shù),因?yàn)闆]有調(diào)用<a href="qwidget.html#setFont">QWidget::setFont</a>()意味著“復(fù)位到根據(jù)上下文特定的字體”。
<p> <li> “可設(shè)計(jì)”特征說明它是否可以被一個(gè)圖形用戶界面生成器(例如<a href="designer-manual.html">Qt設(shè)計(jì)器</a>)設(shè)置屬性。對(duì)于大多數(shù)屬性都有這個(gè)特征,但不是所有,例如<a href="qbutton.html#isDown">QButton::isDown</a>()。用戶可以按按鈕,并且應(yīng)用程序設(shè)計(jì)人員可以讓程序來按它自己的按鈕,但是一個(gè)圖形用戶界面設(shè)計(jì)工具不能按按鈕。
<p> </ul>
<p> 讀、寫和復(fù)位函數(shù)就像任何成員函數(shù)一樣,繼承或不繼承,虛或不虛。只有一個(gè)例外就是,在多重繼承的情況下,成員函數(shù)必須從第一個(gè)被繼承類繼承。
<p> 屬性可以在不知道被使用的類的任何情況的時(shí)候通過<a href="qobject.html">QObject</a>中的一般函數(shù)進(jìn)行讀寫。下面兩個(gè)函數(shù)調(diào)用是等效的:
<p> <pre>
// QButton *b和QObject *o指向同一個(gè)按鈕
b->setDown( TRUE );
o->setProperty( "down", TRUE );
</pre>
<p> 等效的是指,除了第一個(gè)函數(shù)要快一些,在編譯的時(shí)候提供了更好的診斷信息。在實(shí)際應(yīng)用中,第一個(gè)函數(shù)更好些。然而,因?yàn)槲覀兛梢酝ㄟ^<a href="qmetaobject.html">QMetaObject</a>獲得任何一個(gè)QObject的所有有用屬性的一個(gè)列表,<a href="qobject.html#setProperty">QObject::setProperty</a>()可以讓你控制類中那些在編譯時(shí)不可用的屬性。
<p> 像<a href="qobject.html#setProperty">QObject::setProperty</a>()一樣,還有一個(gè)相應(yīng)的<a href="qobject.html#property">QObject::property</a>()函數(shù)。<a href="qmetaobject.html#propertyNames">QMetaObject::propertyNames</a>()返回所有可用屬性的名稱。<a href="qmetaobject.html#property">QMetaObject::property</a>()返回一個(gè)指定屬性的屬性數(shù)據(jù):一個(gè)<a href="qmetaproperty.html">QMetaProperty</a>對(duì)象。
<p> 這里有一個(gè)簡(jiǎn)單的例子說明了可以應(yīng)用的絕大多數(shù)重要屬性函數(shù):
<p> <pre>
class MyClass : public <a href="qobject.html">QObject</a>
{
<a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a>
public:
MyClass( <a href="qobject.html">QObject</a> * parent=0, const char * name=0 );
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
};
</pre>
<p> 這個(gè)類有一個(gè)名為“priority”的還不被<a href="metaobjects.html#meta-object">元對(duì)象</a>系統(tǒng)所知的屬性。為了讓這個(gè)屬性被元對(duì)象系統(tǒng)知道,你必須用<tt>Q_PROPERTY</tt>宏來聲明它。聲明語法如下:
<p> <pre>
Q_PROPERTY( type name READ getFunction [WRITE setFunction]
[RESET resetFunction] [DESIGNABLE bool]
[SCRIPTABLE bool] [STORED bool] )
</pre>
<p> 為了聲明是有效的,讀函數(shù)必須是常量函數(shù)并且返回值的類型是它本身或者是指向它的指針,或者是它的一個(gè)引用。可選的寫函數(shù)必須返回void并且必須帶有一個(gè)正確的參數(shù),類型必須是它本身或者是指向它的指針,或者是它的一個(gè)常量引用。元對(duì)象編譯器強(qiáng)迫這樣的。
<p> 屬性的類型可以是任何一個(gè)<a href="qvariant.html">QVariant</a>支持的類型或者是一個(gè)自己在類中已經(jīng)定義的枚舉類型。因?yàn)?lt;tt>MyClass</tt>中的屬性使用了枚舉類型<tt>Priority</tt>,這個(gè)類型必須也向?qū)傩韵到y(tǒng)注冊(cè)。這樣的話,像如下方式通過名稱來設(shè)置值是可行的:
<p> <pre>
obj->setProperty( "priority", "VeryHigh" );
</pre>
<p> 枚舉類型必須使用<tt>Q_ENUMS</tt>宏來進(jìn)行注冊(cè)。這里是一個(gè)包含屬性相關(guān)聲明的最終的類聲明:
<p> <pre>
class MyClass : public <a href="qobject.html">QObject</a>
{
Q_OBJECT
Q_PROPERTY( Priority priority READ priority WRITE setPriority )
Q_ENUMS( Priority )
public:
MyClass( <a href="qobject.html">QObject</a> * parent=0, const char * name=0 );
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
};
</pre>
<p> 另外一個(gè)類似的宏是<tt>Q_SETS</tt>。像<tt>Q_ENUMS</tt>一樣,它注冊(cè)了一個(gè)枚舉類型,但是它額外的加了一個(gè)“set”的標(biāo)記,也就是說,這個(gè)枚舉數(shù)據(jù)可以被一起讀或?qū)憽R粋€(gè)輸入輸出類也許有枚舉數(shù)據(jù)“讀”和“寫”和接收“讀|寫”:這時(shí)最好用<tt>Q_SETS</tt>來聲明一個(gè)枚舉類型,而不是<tt>Q_ENUMS</tt>。
<p> <tt>Q_PROPERTY</tt>段剩余的關(guān)鍵字是<tt>RESET</tt>、<tt>DESIGNABLE</tt>、<tt>SCRIPTABLE</tt>和STORED。
<p> <tt>RESET</tt>指定一個(gè)函數(shù)可以設(shè)置屬性到缺省狀態(tài)(這個(gè)缺省狀態(tài)可能和初始狀態(tài)不同)。這個(gè)函數(shù)必須返回void并且不帶有參數(shù)。
<p> <tt>DESIGNABLE</tt>聲明這個(gè)屬性是否適合被一個(gè)圖形用戶界名設(shè)計(jì)工具修改。缺省的<tt>TRUE</tt>是說這個(gè)屬性可寫,否則就是<tt>FALSE</tt>說明不能。你可以定義一個(gè)布爾成員函數(shù)來替代<tt>TRUE</tt>或<tt>FALSE</tt>。
<p> <tt>SCRIPTABLE</tt>聲明這個(gè)屬性是否適合被一個(gè)腳本引擎訪問。缺省是<tt>TRUE</tt>,可以。你可以定義一個(gè)布爾成員函數(shù)來替代<tt>TRUE</tt>或<tt>FALSE</tt>。
<p> <tt>STORED</tt>聲明這個(gè)屬性的值是否必須作為一個(gè)存儲(chǔ)的對(duì)象狀態(tài)而被記得。STORED只對(duì)可寫的屬性有意義。缺省是<tt>TRUE</tt>。技術(shù)上多余的屬性(比如,如果<a href="qrect.html">QRect</a>的geometry已經(jīng)是一個(gè)屬性了的<a href="qpoint.html">QPoint</a>的pos)定義為<tt>FALSE</tt>。
<p> 連接到屬性系統(tǒng)是一個(gè)附加宏,“Q_CLASSINFO”,它可以用來把名稱/值這樣一套的屬性添加到一個(gè)類的元對(duì)象中,例如:
<p> <pre>
Q_CLASSINFO( "Version", "3.0.0" )
</pre>
<p> 和其它元數(shù)據(jù)一樣,類信息在運(yùn)行時(shí)是可以通過元對(duì)象訪問的,具體請(qǐng)看<a href="qmetaobject.html#classInfo">QMetaObject::classInfo</a>()。
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -