鏈枃涓昏璁茶ВQt鏄浣曞疄鐜板弽灝勶紝浠ュ強涓鐐圭偣鍙嶅皠浣跨敤鐨勫皬蹇冨緱銆?/p>
Qt鍙嶅皠鍐呭箷灝忕
璇︾粏鍐呭
鍙嶅皠鍓嶆湡鍑嗗
寰楀埌娉ㄥ唽鐨勭被鎴愬憳鍙橀噺
寰楀埌娉ㄥ唽鐨勭被鎴愬憳鍑芥暟
璁塊棶綾繪垚鍛樺睘鎬э紙get,set錛?/p>
璋冪敤娉ㄥ唽鐨勫嚱鏁?/p>
鍙嶅皠搴旂敤
鎬葷粨
Qt鍙嶅皠鏈哄埗鏄熀浜巑oc(meta object compiler)瀹炵幇鐨?鍦ㄨ繖閲屽鎻掍竴鍙ワ紙鍙互璇碤t鎵鏈塁++娌℃湁鐨勭壒鎬э紝鍑犱箮閮藉拰榪欎釜鏈夊叧緋伙級銆備絾鏄渶瑕佹敞鎰忕殑鏄疩t鎻愪緵鐨勫弽灝勫紡鍩烘湰鐨勫弽灝勶紝涓嶆敮鎸佺被鐨勫弽灝勶紝榪欎釜涓嶫ava錛孋#榪樻槸鏈夊樊鍒殑銆?/p>
閫氬父C++鐨勭紪璇戣繃紼嬩負
棰勫鐞?>緙栬瘧->閾炬帴->榪愯
Qt緙栬瘧鐨勮繃紼嬩腑錛屾湁涓涓猰oc鐨勮繃紼?鍦≦t宸ョ▼鏋勫緩榪囩▼涓殑qmake鍏跺疄灝辨槸騫茶繖涓簨鐨勩俶oc->棰勫鐞?>緙栬瘧->閾炬帴->榪愯銆?/p>
鍦╩oc榪囩▼涓紝闇瑕佸鐞嗙殑浜嬫儏濡備笅錛?/p>
1銆?璇嗗埆涓浜涚壒孌婄殑瀹廞_OBJECT銆丵_PROPERTY銆丵_INVOKABLE銆傘傘? 濡傛灉紕板埌榪欎簺鍏抽敭瀛楋紝Qt鑷劧灝變細鍘葷敓鎴愬搴旂殑moc鏂囦歡銆?/p>
2銆?slot錛宻ignal鑷劧涔熸槸濡傛銆?/p>
3銆?uidesigner錛屽悓鏍蜂篃鏄湪榪欎釜闃舵澶勭悊鐨?
鍙嶅皠鍓嶆湡鍑嗗
1銆?棣栧厛寰楃戶鎵夸簬Q_Object,鍚屾椂闇瑕佸湪class涓姞鍏_OBJECT錛屼絾鏄疩_Object鐨勬瀯閫犲嚱鏁伴粯璁ゆ槸縐佹湁鐨勪笉璁╃戶鎵褲?
鍦ㄧ被涓洿鎺ヤ嬌鐢≦_GADGET涔熷彲浠ュ疄鐜板弽灝勶紝銆傘傘傛嵁璇村彧鑳藉疄鐜伴儴鍒嗗姛鑳斤紝鐩墠鎴戝彧瀹炵幇鍒拌兘閬嶅巻鎴愬憳灞炴э紝鍑芥暟錛屼絾鏄笉鑳借闂叾涓殑鍊箋?
榪欎釜榪囩▼鍏跺疄灝辨槸瀹氫箟QMetaObject鐨勮繃紼嬶紝鍏蜂綋瑙丵t婧愮爜
2銆?娉ㄥ唽綾繪垚鍛樺彉閲忛渶瑕佷嬌鐢≦_PROPERTY
Q_PROPERTY( type member READ get WRITE set) 鍏朵腑READ,WRITE鏄叧閿瓧
Type琛ㄧず鎴愬憳鐨勭被鍨嬶紙涓嶆敮鎸佽嚜瀹氫箟綾誨瀷錛屽Qt寰堝鍩烘湰綾誨瀷閮芥敮鎸侊級;
Member浠h〃浣犵粰璇ユ垚鍛樺彟澶栬搗鐨勫悕瀛楋紝鍙互鍜屽彉閲忓悕涓嶅悓錛沢et錛宻et灝辨槸鑷繁鍦–++鍑芥暟閲岄潰瀹氫箟鐨勫熀鏈殑璁塊棶鍑芥暟鍚嶏紝涓嶉渶瑕佸啓鍙傛暟銆傜洿鎺ヤ笂浠g爜錛?
3銆?娉ㄥ唽綾繪垚鍛樺嚱鏁?
濡傛灉浣犲笇鏈涜繖涓嚱鏁拌兘澶熻鍙嶅皠錛岄偅涔堝緢綆鍗曪紝鍙渶瑕佸湪綾葷殑鍑芥暟澹版槑鍓嶅姞鍏_INVOKABLE鍏抽敭瀛椼?
渚嬪Q_INVOKABLE int func( QString flag );
銆銆銆#include <QObject>
銆銆銆class MyClass : public QObject銆銆銆{銆銆銆 Q_OBJECT銆銆銆 Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
銆銆銆 Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
銆銆銆 Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )銆銆銆public:
銆銆銆 explicit MyClass(QObject *parent = 0);
銆銆銆signals:銆銆銆public slots:
銆銆銆public:
銆銆銆 Q_INVOKABLE int Member1();
銆銆銆 Q_INVOKABLE int Member2();
銆銆銆 Q_INVOKABLE QString Member3();銆銆銆 Q_INVOKABLE void setMember1( int mem1 );銆銆銆 Q_INVOKABLE void setMember2( int mem2 );銆銆銆 Q_INVOKABLE void setMember3( const QString& mem3 );銆銆銆 Q_INVOKABLE int func( QString flag );
銆銆銆private:
銆銆銆 int m_member1;
銆銆銆 int m_member2;
銆銆銆 QString m_member3;銆銆銆};
寰楀埌娉ㄥ唽鐨勭被鎴愬憳鍙橀噺
銆銆MyClass theObj;const QMetaObject* metaObj = theObj.metaObject();
//1.閬嶅巻綾葷殑灞炴?/span>
int propertyCnt = metaObj->propertyCount();
for ( int i = 0; i < propertyCnt; ++ i ){QMetaProperty oneProperty = metaObj->property( i );cout << " name: " << oneProperty.name();
cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";銆銆}
涓昏鎬濊礬灝辨槸寰楀埌鍏跺厓瀵硅薄錛屽緱鍒板叾鍏冨睘鎬э紝鐒跺悗灝辮兘寰楀埌浣犻渶瑕佺殑淇℃伅錛屽叿浣撶殑璁塊棶鍑芥暟鏈塶ame,type,闇瑕佹敞鎰忕殑鏄緱鍒扮殑type鏄灇涓懼鹼紝榪樺湪Qt鎻愪緵浜唗ypeToName鐨勫嚱鏁幫紝浣犲彲浠ュ緱鍒版兂瑕佺殑錛堜緥濡備笉鏄┖媧炵殑2錛岃屾槸”int”錛夈?/p>
//2.閬嶅巻綾葷殑鍑芥暟鎴愬憳
int methodCnt = metaObj->methodCount();
for ( int idx = 0; idx < methodCnt; ++ idx )
{
QMetaMethod oneMethod = metaObj->method( idx );
cout << "--------begin-------" << "\n";
cout << " typeName: " << oneMethod.typeName() << "\n";
cout << " signature: " << oneMethod.signature() << "\n";
cout << " methodType: " << oneMethod.methodType() << "\n";
cout << "--------end---------" << "\n";
銆銆}
鍜岄亶鍘嗙被灞炴т竴鑷達紝鍏跺疄灝辨槸鏍規嵁鍏冨璞★紝寰楀埌鍏冨嚱鏁?
鍏朵腑typeName浠h〃榪斿洖綾誨瀷錛宻ignature鍙殑鏄嚱鏁扮殑鍘熻矊錛宮ethodType浠h〃鍑芥暟鐨勭被鍨嬶紝鍦≦t涓垎涓轟笁綾伙紙妲斤紝淇″彿錛屾櫘閫氬嚱鏁幫級銆?/p>
//3.浣跨敤鍙嶅皠
cout << "-------test property-----------" << "\n";
MyClass newObj;
newObj.setProperty("Member1", 66);
cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
cout << newObj.Member1() << "\n";
銆cout << "--------end----------" << "\n";
鍦ㄨ繖閲屼嬌鐢ㄧ殑鏄疩Object鐨刾roperty() 鍜宻etProperty鏂規硶錛屾潵璁塊棶鎴愬憳淇℃伅銆備絾鏄浜庝嬌鐢≦_GADGET瀹忕殑綾伙紝鏄笉鑳戒嬌鐢ㄨ繖涓柟娉曠殑錛岃繕鍦ㄥ鎵捐В鍐蟲柟娉曪紝鍩烘湰鎬濊礬褰撶劧鏄噸鍐欍?/p>
璋冪敤娉ㄥ唽鐨勫嚱鏁?/strong>
銆銆int ret;
銆銆MyClass newObj;
newObj.setMember1( 20 );
newObj.setMember2( 50 );
QMetaObject::invokeMethod( &newObj, "func", Qt::DirectConnection,
Q_RETURN_ARG(int, ret ),
Q_ARG(QString, "+"));
//鏅氬嚱鏁扮殑璋冪敤
鍦∕yClass涓紝鎴戜滑瀹氫箟浜唅nt func( QString flag );榪欎釜鍑芥暟錛屽埄鐢ㄥ弽灝勭殑璋冪敤鏂瑰紡濡備笂錛屼富瑕佹槸鐞嗚ВinvokeMethod鐨勭敤娉曪紝鍏朵腑Qt::DirectConnection鏄嚱鏁扮殑鎵ц鏂瑰紡錛屽垎涓猴紙寮傛鍜屽悓姝ワ級錛孮_RETURN_ARG鏄繑鍥炲弬鏁幫紝Q_ARG鏄紶鍏ュ弬鏁幫紝闇瑕佹寜鍑芥暟澹版槑涓弬鏁扮殑欏哄簭渚濇浼犲叆錛孮t鏈澶氭敮鎸?涓弬鏁幫紝瀵逛簬涓鑸殑搴旂敤娌℃湁闂銆傝繕鏈夌枒闂紝璇風Щ姝ュ叿瑙丵t寮哄ぇ鐨勫府鍔╂枃妗c?/p>
鍙嶅皠鍙嶅皠錛屽氨鎴戠洰鍓嶇殑璁ょ煡姘村鉤鏉ョ湅錛岄氳繃浣跨敤瀛楃涓詫紝鏉ュ疄鐜板嚱鏁扮殑閫氱敤鍖栬皟鐢紝渚嬪浣犲彲浠ュ埄鐢ㄥ弽灝勬妸寰堝鍑芥暟鏀劇疆鍒版暟緇勪腑錛屽疄鐜頒竴嬈¢亶鍘嗭紝鍏ㄩ儴璋冪敤銆?/p>
鐩墠鎴戣鍒扮殑澶у鏄埄鐢ㄥ弽灝勬潵鎿嶄綔鏁版嵁搴擄紝渚嬪hibernate錛屽叾瀹炲彲浠ュ埄鐢≦t鐨勫弽灝勶紝蹇熷疄鐜版墍璋撶殑hibernate,(鏈榪戣嚜宸辯嫭绔嬪疄鐜頒簡涓濂楋紝寰堟柟渚?銆?/p>
榪欑瘒鏂囩珷涓昏璁蹭簡濡備綍浣跨敤Qt鏉ュ疄鐜板弽灝勶紝鍦ㄥ疄鐢ㄨ搴︿笂鏉ヨ錛屾垜浠笉闇瑕佷簡瑙t鏄庝箞瀹炵幇鍙嶅皠鐨勶紝瀵逛簬鎬庝箞鐢ㄤ笂闈㈣鐨勫緢娓呮浜嗐傚ぇ瀹舵湁浠涔堢殑鏂扮殑鎯蟲硶錛屽笇鏈涜兘鎻愬嚭鏉ワ紝鏉ョ數璇峰挩璇?br /> <levard@gmail.com>