Posted on 2011-05-12 07:24
RTY 閱讀(2055)
評論(0) 編輯 收藏 引用 所屬分類:
Qt 、
轉載隨筆
和C#類似,Qt為類提供了可以“獲取”、“設置”的快捷方式——Property,目的都是為了:數據成員方式使用,(函數成員方式定義)。
C#使用get、set方式,達到“數據成員方式定義”的屬性;
Qt使用普通函數成員+Q_PROPERTY宏,完成屬性,及元數據(簡單說:就是運行時可以查看的有關類的信息)的加入;
<*.h>
……
Q_PROPERTY( type name READ getFunction [WRITE setFunction] [RESET resetFunction] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] )/*
Q_PROPERTY宏:將信息注冊如元對象(QMetaObject),
QMetaObject類:提供一系列方法,查詢、修改已經注冊進的信息(如:屬性、枚舉、繼承關系、類名、信號、槽);
QObject類就利用QMetaObject來查詢、修改屬性的,同時也是一種“運行期操作類屬性”的方法;
name用于QObject獲取、設置屬性時使用;
READ是必須的,不同與C#(C#可以僅定義只寫屬性);
*/
public:
void setFunction(type);
// 參數(或下面get函數的返回值)的類型(type)可以是QVariant的繼承類,
//也可以是enum,但必須用Q_ENUMS(myenum……)注冊為元對象。
type getFunction() const;
void resetFunction();
private:
type n;
……
<*.cpp>
……
void MyClass::setFunction(type name)
{
n = name;
}
type MyClass::getFunction() const
{
return n;
}
void MyClass::resetFunction()
{
n = defaultName;
}
……
<使用方法>
方法一:
MyClass *mc =……;
mc->setFunction(value);
mc->getFunction();
方法二:
QObject *qo = ……;
qo->setProperty("name",value);
qo->getProperty("name");
除了上面提到的,QT的元對象還提供了一些其他的東東:
宏有:
Q_OBJECT
Q_PROPERTY
Q_ENUMS
Q_CLASSINFO
Q_OVERRIDE
tr()和trUtf8() 兩個函數是用于國際化中的字符串翻譯
______________________________________________________________________-
定義格式如下:
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool])
Q_PROPERTY() 是一個宏,用來在一個類中聲明一個屬性property,由于該宏是qt特有的,需要用moc進行編譯,故必須繼承于QObject類。在外界看 來,property跟類中數據成員沒有什么區別,但是還是有幾點不一樣,參考qt文檔,主要有以下幾點:
1.必須有一個read函數。
2.有一個可選的write函數。
3.如果定義了"stored"屬性表明這是一直存在的。
4.一個reset函數能夠把property設置成其默認狀態
5.一個"desinable"屬性表明該property能在GUI builder(一般為Qt Designer)可見
然后對照這些,自己寫了一個例子
class Test : public QObject
{
Q_OBJECT
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
public:
Test(QObject *parent = 0) : QObject(parent) {}
virtual ~Test(){}
void setEnabled(bool e) { enabled = e; }
bool isEnabled() const { return enabled; }
private:
bool enabled;
};
然后在主函數中
Test *test = new Test;
test->setProperty("enabled", true);
//test->setEnabled(true); //ok also work
if(test->property("enabled").toBool())