From 022891bcd8ae4e8de02cdef9ed281e9a31eedbc4 Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Fri, 26 Nov 2021 15:49:18 +0100 Subject: [PATCH] Document the example showing the benefits of using bindable properties And mention the example in the bindable properties docs. Pick-to: 6.2 Task-number: QTBUG-97655 Change-Id: I676e90dbda66c2e718c7f6c2240fac608a8653df Reviewed-by: Leena Miettinen Reviewed-by: Ivan Solovev Reviewed-by: Fabian Kosmale --- .../bindablesubscription.cpp | 8 + .../bindablesubscription.h | 4 + .../bindablesubscription/bindableuser.cpp | 4 + .../bindablesubscription/bindableuser.h | 5 + .../bindablesubscription/main.cpp | 2 + .../images/bindable_properties_example.png | Bin 0 -> 18831 bytes .../doc/src/bindableproperties.qdoc | 202 ++++++++++++++++++ .../bindableproperties/subscription/main.cpp | 10 + .../subscription/subscription.cpp | 20 ++ .../subscription/subscription.h | 4 + .../bindableproperties/subscription/user.cpp | 4 + .../bindableproperties/subscription/user.h | 4 + .../src/objectmodel/bindableproperties.qdoc | 14 ++ 13 files changed, 281 insertions(+) create mode 100644 examples/corelib/bindableproperties/doc/images/bindable_properties_example.png create mode 100644 examples/corelib/bindableproperties/doc/src/bindableproperties.qdoc diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp index d962216cd99..14b28b3fae7 100644 --- a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp +++ b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.cpp @@ -51,6 +51,8 @@ #include "bindablesubscription.h" #include "bindableuser.h" +//! [binding-expressions] + BindableSubscription::BindableSubscription(BindableUser *user) : m_user(user) { Q_ASSERT(user); @@ -62,11 +64,17 @@ BindableSubscription::BindableSubscription(BindableUser *user) : m_user(user) }); } +//! [binding-expressions] + +//! [set-duration] + void BindableSubscription::setDuration(Duration newDuration) { m_duration = newDuration; } +//! [set-duration] + double BindableSubscription::calculateDiscount() const { switch (m_duration) { diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h index 86dd0bdf26e..763864d6279 100644 --- a/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h +++ b/examples/corelib/bindableproperties/bindablesubscription/bindablesubscription.h @@ -56,6 +56,8 @@ class BindableUser; +//! [bindable-subscription-class] + class BindableSubscription { public: @@ -84,4 +86,6 @@ private: QProperty m_isValid { false }; }; +//! [bindable-subscription-class] + #endif // BNDABLESUBSCRIPTION_H diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp index fc651c25796..d30e203b612 100644 --- a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp +++ b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.cpp @@ -50,6 +50,8 @@ #include "bindableuser.h" +//! [bindable-user-setters] + void BindableUser::setCountry(Country country) { m_country = country; @@ -59,3 +61,5 @@ void BindableUser::setAge(int age) { m_age = age; } + +//! [bindable-user-setters] diff --git a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h index 1c370780768..65541e6ac1e 100644 --- a/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h +++ b/examples/corelib/bindableproperties/bindablesubscription/bindableuser.h @@ -53,6 +53,8 @@ #include +//! [bindable-user-class] + class BindableUser { public: @@ -78,4 +80,7 @@ private: QProperty m_country { None }; QProperty m_age { 0 }; }; + +//! [bindable-user-class] + #endif // BINDABLEUSER_H diff --git a/examples/corelib/bindableproperties/bindablesubscription/main.cpp b/examples/corelib/bindableproperties/bindablesubscription/main.cpp index 2ee39c5bb56..df935679ade 100644 --- a/examples/corelib/bindableproperties/bindablesubscription/main.cpp +++ b/examples/corelib/bindableproperties/bindablesubscription/main.cpp @@ -103,6 +103,7 @@ int main(int argc, char *argv[]) QLabel *priceDisplay = w.findChild("priceDisplay"); // Track price changes +//! [update-ui] auto priceChangeHandler = subscription.bindablePrice().subscribe([&] { priceDisplay->setText(QString::number(subscription.price())); }); @@ -110,6 +111,7 @@ int main(int argc, char *argv[]) auto priceValidHandler = subscription.bindableIsValid().subscribe([&] { priceDisplay->setEnabled(subscription.isValid()); }); +//! [update-ui] w.show(); return a.exec(); diff --git a/examples/corelib/bindableproperties/doc/images/bindable_properties_example.png b/examples/corelib/bindableproperties/doc/images/bindable_properties_example.png new file mode 100644 index 0000000000000000000000000000000000000000..f38261a217ff3f3d26c0beb0ffca4be7ee23286a GIT binary patch literal 18831 zcmeHvbyVEXvL^`vg1c*Qp8&xvNP@e&yAN(dfS`jza0%}2!QCOay9Kx4wnKjRz5Di^ z^LFpuef!6rbHC@znfZRZySlo%y1J_C^PLcRSutb;0t6^1C}at7QAH@I*P&2QulV1> zLY{;vi7Y|Bz#hu#PKpMuWcENiQwwVoGADO?6EYJw3sWd4w*{4mMdYvYZ$+OAJ2BjJ zNVf6RVvqEP5*SRwccEd01AQN_`Sp{~=zpD7eCQHZik-#q4JX5(7}2e5Y?7xdJ4+X8 z2r%K=cPt161gg)i@7s29EH*5;<2KU6cRI6=n8ta98TNqQowRs8&GQVvL(wyR2BD$h zK|vwFT0q!RmyzZ%va?|}Ft#%^VRo~zhwuvp#V6=yZ(w9);zVX>VrF5>Pkz$WMowm7 z%ulYyF7sZ-Uc|)QLfivrqU0f~Y~*2O#BEG2D1gA{#seW>W8!2$=4NAU>&WBAPyUB4 z59IgDV*okXpDIpP{N(B~@?;`*KohbL%paKFGktQiaA74EKp^7-8k_PcihlkZ3CJBk zxw(^*Jr4lj>gvku%EoL5Gy|}3b8`dUvjSLInIJWo9Nlf54BVJ(9VuQ&{6$05#L)<7 zVee#NXG``%)4T=98ym9H{vf-@bA=Z9sec-h&TW*B>)!Y_kjOc-O0lAzo`CF z^7ra5jd|oP+)S+1MJ;ShY#kvi@RM_}zyCw*@1+|5p_Gk<^H1puB_0VI12Ypf3u7nq zzc>4Pfw+lq2={;A6U(yo7r>z|UqKUMi(+V%gJxDfvC+?m)yJUUm1>&CujBnEN&-Z%5A$$^>EY9UdSdUj;1>E}!HB|OTNkJc zb~At4qs^kF|4x?mdqpTmZI6r$O`M|T@Yu`eE6!WADD&4RjNran}C;;G%!6~o0Fe!=BlPP>me&E3xm{k`m+oZ(quqGdQ!S#-kK&hHg>kVuTM@& zR#xCt&M&LFy!?c>5xDKqzqoi`5)>pRR6L!mC!`=MDoSYv`>AOe#QN^ty0Nshw79kP zVQN7^LFUK(BiK*7eD3F7Cr3xbXlQ7s`j(bOW|o%pc@~Drc~>>T!NKAvMtHD+25X0h zVX?7F+M=S}q?MJG>jnk}{A>u|8N$;3+1cxsrAEhu)5}Yn#Kgp3hSl>}XrCb60=XtX zR4yLPS##jp*_{ZZ1Z}2TB!7yHiBUDCr~UEcNBr;WYad=RvhUi4hFM^jLP&4@Eq$id z_$w~_7c27?-;WKUR?aePwPF`3mD#qlyWd5nlKu0&Q2zeF;5!JO- zKDSBDm*Qe8ZyK6>w4koc78-JLav&<345pdc?t`tZ?IkNVR;j9$0GVi$EQG(U)~Hp( zN^MR`maZ~0aL^3X>iNQ_%G)|qW8kOY zf@o%=dizty+tsd~-5*F(k!y_7$;o&KET_z{OGX3g*$P?AxT_qQs#_D= z{kjI`U7DDLunQFEIdx}>rf81_y!}4Pd+AtEhdGQ_UGRq5&5nk3Lie$F$Z;j@udj9 zc?chRcNU|0Ea8Q}?JTxS1oH`fKv6cAaI)Y#Tj1l{N!Z^;!|{k~-!g#MK*u|KP1oS) zV&n`aB4L}MR&c33PEjjs5WLRokfe*(r2=!}``ctYa@m|dIVR%oj|cMSEA3e+`T#p_ ztY5yZ@yMM6pMwer_Q8&d9}N29Sv`K5m4t9~^nXgadi*t8i~bE^rx(K~d6{ixvxhEv ziumS38Y!bx<-;pCjo1)A)>zK;6_Fs{$nn8VySW;_u`8U+&1c>3-i_p2h{NGQR7t0s zS{ed27_qn{l*jwk6-xN9!%N*zWX|{EJXaYV8u<5j9B{`BkdWQD%Q$el6QQc+R9O*43RU1TP)+wKS)GGZV3C~f?!C$cUe)`rydXXrC=xz zh#o7ns`er0>k#5}^|gBGs5$+pFn3;3ke?c1B#+5G4DvBtl7kE3^eUJzdn3r4+*eP^ zFO>ppRX;Hfh+rEg`sue*s`+y}8@W4K^}Kdp92rpY28S#o#W$%YAVf~EH+y+uym|9& zU5+1B1&o|CLqHRL&%*k$`9cG}3;{>}b4|9k0CtKG+r{lnjrGEp&vG)G-QlC-I~E{N zB~xi~-9};Iy#z;d!BjEaba|_L59sSj#)oZcnqOg^59H7_&yVtTdiE&a@1Hqy{D+BG}QDfP-|lxEixpJ3BbboL}`^YZhcdO zs*~;&B;m;E$U2=dA>(n;HXwL9AaZ-MMrqs^ZwaT!UG2f{X`|nOn`N%caAkC$;X@9y zWOce;Q{TamfG`~l?I2=)Uzn0rxWQz66gaR+8bboN<)D`iw05>jc$c@QsAKXFPKbaBXgzPzh|iAe!{- z8^20@Tc#JuDyvVOy7tS0*VK~njE>svjZ#f8O>d<-5)Dnod_&#!yo)`mPhQQ2?^3P# zB5fiQm||eDh+8EUdHBZvkk?l25q-c^=sm-+ZR>pPR<9`Mf}0*Y&V0q1Mq8J&5eDFK z5n}KSaiwKkcP|3p%<_T;{rs|mjp?igBAU-_?Lr}^bV0O}mEn=#)n`@52l-^+ToXAn$w`6*QoHsPr^C7e@ znxP#|t*bZWwt5Z^P93s=squ|iZs*P4w<%DO<6nP;K{{j!E3#qO$yCv>6ClE8O^Q0t9SbR z!(t$>W2}+KRaV~u*SP& z?b@;4G!FAs`vNE{j85gN_~z_6mb=ViEjV<1xya>q_nO01@HL zM}BxBp6ci>JPgkE{9?&!4+Cb9_z_LCMgjqsTmV;_tXoqZx_@0T95#9 zh&YUHJZfdy?|Asg$<-VR`+oLNm~WqPPNsWt9dQSflRx`CfgEbCezf!%jD%k{lU)~staC$`;0;@m~x{y9Z zg;=0{9?pWUA|Q?Wy|WB^LT6k48VdSA)c=mwf8FJlx$FWAgwOfK^{$|h@Ng=~Z!O!5 zwl+Zl0fDc9fki~z1w?-Ya{W>K1Cl>1GJ)~I(Ndiap;!b_ruldly%-9um}%jQASemJ z;o-T!?ZL#nq|#@4wK7N?5jGetGMM?D_QlEWFI!HjZz`o18!h35*iuNGvLijI%&i>p z{8ba{#iyneu~dLKw*xy<82P|IJokH><=WMz$X;71`xmu=WP9SvtF4|Tphh29(sL{v zxqi=>J>NVMezqAGl7I1w2j;6h8R8A_xT}a}ZRKQ{`qD^HA>J8!v}Y6;JmhotL`O%* z^H$Bl#ie!ccdP*}?VQV$bGhBkzJp~v;52eoke!`fYB2YO-?(Fb`m+S()yV$CCXkYvdgUANYYmaR*vaZn?w;$m8)XSd2%+$!h_pR{O zaI^f)kC<@XRx8vvfoh8ylou-*EI#TCh&*aSOR--(2nmrIcG>O^>HEW_XcarD-L>=x zE@8&ku4tSKph>7L<|ZMoMxe|7U`vW*?_YxTGBuU2i9mUJu?_%6EaICXl<6~dAH4VPNG>a{u8 z5F*_!%i<{JRuA%qauyEp6UO=;R(QNml z++W$oZFUAAa_Ueg5Q+l4-*s8kYeJqK$o`@B_xWe$t?M?a33pYDfRiozu?-v_A1_G< zUHVtbEP2#!`syAX-?{8g#gFrHlO$!ns0>7BqyA`rRikI)Cxz{slfh{G|HP`2RO(X;qxEaG3Yio3}yl!Xr?Y1A*+G>FN>M=vTXiW zH}g^H*>2%q#L@<<3@6LU6zVkj_`?@AZ2^v7Pp(_Uhv2 ze>gLUMUtqfL)N&0e6wp$Z|_8fLDxMq4ziF@W7_rr>o*aPU(0htKF!%MYku zgMzGRAl7mz8=?*g%eH@}n3i_Xn+OX~iwFDWjXB&)b+fA0gLzQ!xQzeV#bwVdAo#B9 z%5V}iRws0}-*&M(b}>McaSHj^KRw(Y)c`wU02KynhJU zwXKuyr#mg8oX#}KK38wSk21VKhwZWC3^TR7tzVMpBqXDdaR!HlH9u$?8&h@#B2SJm zK!ki9%}AVWzW5BSS02*WEqqLHNn2&az8H(4E_lm(#digZUFPk&$j#v`7%^tXXxPxqfjU-ftkF2zuv{1h`$Db z>E^`Y0F7(KFK}9kc4f*5PFRk`7l+-HllkE2#jEv0Al+~FcPDyMh4(!?E;(1(-x=0| zsaXffd~P+B%eK-s8M<=6t5=(jNRPan0bSQI9(ZtMXHUMF~tYYx6_e^ z>k)KKk+yF5r(>ViB~p^!MR4}nZfCea>A{CU!GBF_`NCeq6#(e5T6FKsTB@La8Y%40 zA^MpHI{5C^9Km-nZ=TM0 z{AP};&YBMHWZ`HUWpva#K+Wv_=Y5wMon4Fi;GD7cxqJ1~wj>rp|0n(Vx@Li0T5jjB zS$|v%V{dsUqTO8!D~b0V_JxuOqf`~I8&tQ~Q9e1m9^P6_;<$M40@bJSBw!_XAY2!p z2XwDbDHAwb14S%OzP9)c@TNW71(%ltT78jke}B~Esmb8(*=w5UHrwnzeEP80`1Raq zhxJG9^EQqwMFFqUGv8=Z0T($cV6zME+3=9U#?4A3<_{yZw5HvyKGc)-dHfiC(oboe z4EOmk+^b{+-Y)NtxI;}5n#_jv)#&xzqK6I)AAqUbCu~f`&ZCNVMH4E%(ZBvDV&jzvo8}a zxfBi?^U1t$0q#E*)s@TwQ}7YUSUUZ)kg`Rdlu_DWOW|gBge^)={^f%p2LZfC@DDg-Q9M#)_VBrVQTb)h1A>jkw)Fw>e_UIH z&}W1oF$sd&GXK8g><4e=)L){|kzf4c3dd8$(((JVr=hD4bqya~&W_*&!99MEJ0#<;y+npLNJxs}DfzMxXAdc|7H>H8n7OQSl&C_(<-_gCwio7r;Fe|Ccw zh7TX&D8wQvfZLJ~H9uZ_tgxQ1k{&zQ-3^M2MEwNDQGvnuv*Fj%okCg!=a`K%|4E9x z`1CIYFT+CrzrOkJqVpFc|M&d-PXqezWv;P}+XB}(dP+Rvcx5Cb2*q(J8|85!erj}- z91_sI)_~UbbG!{Nkz5YUo{`eq~EQzsg7-7%I8lJ zmP>lQ*;syUprj)2Jp?;E7ar!B2gv5gEvi~NahBPof$7om>T%FFhW7LFKD$KD>gb2A zCyg2Aa(TKzFXz9G34b+IE%$~q&Y3 z2jVrw15B+FH;+pIAi*J1fPr0u2=)%B+=@q#j@Hzh3cPb&n0;fopsi|q4@R_%h_x!w zYfI;G-j8BXD;p{g2nxa^ApzY!L*nPDGMyBNU0eow(@DX}fA~)6?Zch19>U}@O-2v* zX3|l0X}RQ=D3cqw%)3p$iMh#9+q-GzXo?dm=E?AO4tGzxp6HXXA3U9M-~ur$tL2%( zQ+OTueaK$(+~%h|QswO?nuBEgk(k{1T{vm4S2nU;nzT#!WLp76#@sTQ4XGgl87*X&|vWUte(OuKQS_Ji(N$8Gg4SpjW8cI$5JNu(Y& ztjy>mPpU-Fg#u%S(AMoK!z2;xgXD! zky>!t>uXvC811ybJ|tlI60H>r6?=NZgGsa$qzAZW%|kwcXBJGn#0`R8xRTA0x{Sd> zLZPJfp|f-)9_&=AlNu2#A-KXDDNe|ew zn^}7vXYPmc#IyQ*ovi}t`7QIuq`Szofpa#s2($Cg0@k_#7`GQ_c-q0ha1yhrA5#1P z6xmU4a9Mb zZM4GZu{iFX9CCZa7u*;t9&y9~QcX|J>6%vx*+^|9h9CAf>fUD=8F@4dra8lnp=YE@ z3*WHRJ@ABrm=-R^NgWbIK5h*J5c%^g4f*DpX!Kf8cBhs{ z!RuL>H~oXg1Knk-4-p!1iFuM^a z!)$=w1Bg9jzB$@EzG%w3T?bAe<=!rR&TvEutfreUvaTF4Ox*ViModC>p=;|5jCbP< z=T(+I+ej`K?i2pG5vg7H7~^(={<_~6X%Q>D%Rbw!NeyqRk&-B}r+>W-NNdY$v~rgm zgexHCV0E{Fb971#sOtygdxvfwBh#*Lh0gz=^HpkHFQM?g1kYg1HZrYrSAzz4Hl*7% zgKfVH=?uDf;3FtPPMz=i zLqD+U_TQS(M4b8)g;gnLS@s|`JtCb*D%05-baaTMx_;4mmZuQKa zk>C-|Q>h8vSf)7WxM%-ol@OCQ^Yonvl&Tlvw;U&ngrNgT4bG5CAFPeWZy6KyHJI{g zq3LkyE2b!I$0X9*lKACge8oITOpU5*jRudmwMTt?t9C3wYS{W~exNuYtRW7|(~yYr z^D55DNi;5^d}(U9jg%*g=Q?~kf&3dV6#!Kr?s{XeNMXPTw_1y7E3%6tS*2P18JLi% zQ0)=d7Dsz{KT$6Z!r<9WwzI7MpD!()WFlm zq4P^A-rMPhy3G55q2=@Gst`e4uDURn=(gY8)YVj28;=jt z5`9rJ*IH1Mw%TENO>nWq8(yy2K$Q!y&Kj@qp0n=ben=q3!m5tT$RJ%`U&o@A|MKMv zl;w0$&(25+pq`$D*Cov3a)15c0P!OPFtqJs)*tqcbs<9PJL)k=#_jm5^Fta}2va2A zV4wry**-@s^KHrD=>SX+MF_{c+04?zu#0S$M__~QZC#%1<9UTKZ_`Et9@eBIBGYF9 zBj{ZUq9tAbR<-~zb|;2=dKeD7SIW=IN?y4!z3#%N#{nM?3c@FZ9HGr~4-iEE?2;S~ z?o16|2Ris~+Tr2hKr`a7-eV`b*>jM#@kR$MMq=Qce2vs1FO&$7Xgwl9firVCTK5_x z31lB03m#gureU8BZyPgx8Wo-%u$G@?2Kua-d=_Yoy4svo0RDWPUYzJMQ$;-AliolX zfl?;CG7BKJwx)AAPebXFMGr$;T}!}%`%9cJSw5jQJjKy=wLmACz=pr#V#DmK=g z)))vIE^5Z*-23X5RRM9?aw1nps5Q+V$#V-~$430S@8s+F0A45>NtZ+E0PwPJq1nv& zbg;v)c6G{TK1HxY!{$MH>I|_(UQ|q0>uw1S8rnw)CT#mzE{Qb&;y!A(LRaXvcz9h- zt0m<3LC%iR(ClLoutl7Z+_2BO+mosy1;r*M{PC~$;ZcYR2HVRmHzJ_RwRO=jWx_Tm z_OMu=sM{on?SZ}cye>fl$hd8qkrtA-rBg`Nl9~_g`bqoiYAv|{2s?>JMW3j6wUO&b90%_xLDOlWqm2~5wh*P}s;veGbvo*(3JS88^6&GUM~ zxNAD-qhRC#Lkc^Z-R`ihKcWiB@yAMu3}8FX=!9NE#gsd`0m^%A`iVxR!W!G%x#{Lh zdE8dMRKF14V!8LXk2>OfKAP-%dRPPmgXh~r0|@|9NX(JYwUJxNqo!vd_UV(u>6#D$ zhqc=zP7fl>+VP(6D?DEt{5d1M(%#XowtG}Q#s1fcZf+hQhhYqf)|6{7w)y+c?vuT9 zrpn`H9!)=28I0J{-cfGz`D&$~ATRMPu>`-n^MeGVV;bhsJ-%Ql?1b>jupfPePy%{ z$$~={N0u9}=hB4FSZ0>5ZU^3a1Pj=#gQ1354IeT^jSeS@~6y*cg<=m2lFLt&%^y#Lb(6Zf{Uuo3A5zZgW$- zS;*+iQW7L)t_D4NSk9Jt-+uM5!If54#v^t$iCZ{KQy^to$tnTt@XQTqhp{a+s!qTp_KY6Pnud# z!`6geae}BL2ep;vxeG>|4@bmT7FB^Bvy}Y_WDj~I!Z`%Uq$swk>lB}=pM*-2To94= zdX8^2X__ax%}m#awKlM+tlH=A6jQic+Mo&?|Mc^J%*gV-^mC(3U5n(_d+%_i5X#RM z-cdUdkuG&P^Wow?x?C6J-wde9YN$^Wfy)BaYiT`5D$qxUXXGOpxyWmU-mAk4f?ma@ z)PK-8kIVN;cQXyUjY>)%IRguXmP)%O&w@hDibf27N%8l4=LwET-5Y!+HfbxRm#YOh zb^(yPhERPHjO#`oLx`uF6zTe5lxdzff4CG+iX*1GH@`uZIqWlH22AFIXm#r@hy-?I zy97q)tViVbVsu3rZ&S}Mv@O*8F)#W_MF=pCesq^bS~%xG+9t9%mRkEmO?P zUl9@O-^kaf%WE=Z9?7*5pTAlizDvT_i!@y7#N=ACoXB)uNE?iBY&*5S7)2s@f?1V) z43sbuI~_&z#&5mj$WSq2>g;ME+_d>Zu|r9dO$0&GshnKB(OZyG-32oxP@nnO7){na z5(z-I`cWF)*?IG`v!2}zAe~k3+1=M3qF{yk-^&|2JD;bER5a?W@jb7Px3>mjDJdzV zqN3UdVrk}^Tmi+ZrCE~S=o=cBv*5eJXgE-o_?H3o>FVdT8<%pc*;4TNLu&mb=_FAE zT>)<}?Q=K2;}3gP)91H(q%#wHo*lEIlBC}-VDbbQ-}##`U1Cu@&0-8?&HkFHg!323 z=v%3f4uh_KGimS>JSCCZv*wT@(G;>EIZiS*kv#b|z$r(I*qh31=nfXI71_;a#p|={ zSYOA<%G#Oi(XY7!CQw94XM1@9n~yoaSGZJu7mnA>HE=^8~a$A>HT<` z{?`pN8<*uP`4)pju+FxhyLy>^J?h|PVuROxszZM%#wL7j5x*?hHRiMk-i>%MZCvu&WPxmL9uR{|9&hF$t#=6mSJTlcKZx>ETky**;%KF z8?~s7JtfI*h8lF-#CK-zNdkI6Zq;`BA}+Sz>X3p;b75Iq?R6>5oBY9AI0Y9sO0${h zlNV#XJLq)+z1*o&8rM?k?@aGVr8EmNwRq-D(?CIDWI4XP?)Ks+3?Z|IRT&AJj z^rI^!Z{}hu;vW=OKjNo@F;HQM*CzV%egy?ca_m z62q0tsp6FwkN0nMla2>4t9ckGcgQq;LZAoF^oz`aoHjib-m2#+2i;Z~pneJ}=e~~- zVQL0V>TP$fF50vm+1`XX&P>I!k`eL4$sO#!&M)!#z*CvKycuUM#jp2WM)O!L6(E2< z$N_gWl7AL~&tC|ce=yblPgVOz^Y{NC(f=(D;2)&(SGE6U=KeF$y}1o;S7Vxk_!8q) z7^V9c5W;c5cXN!!9T5_Gy(m9yURJ|Rn5VSF*ulEYY53m|h(P(<7BjIJ$4wOs$8^Te zg_g+Xix}fcYT``7J{2Mw(OOVOIRFHDwKYH}nY1tSYsrUJulx?& zEnNIoj|JaMn#> zv&Z29R~NQXXOZP13Q>yNNdGK}jU);pL0qvaex}sKytKG(+EJo~!E;hEmI5Oi0#r>= z^*n+)?Lzr_>Q+_gE`pCoKTI5+a9yN37x0I#Le58fGWYX@9FL*aFil)%_tvRNtHc{cv;8Rqs@LKoI}d+>V;4VlNf~dWeDMdMrLMb;BTvK}6iO*N=&d3k&h@|F((8V`_6( z83cKS1IJ>+JC>=2_&MZ>INj*#Y>Q!?<(4Rj<9U=W2o5&N>(q+G)BL?umvzFfgg~SJ zC%r@C?a*bfdVNY6=rR)TUu(llq#D>}e(Tb=K~3_b@P`HmNoUJMS2}49irHLGeT)J( zMyhwnQrtbGx7qH%d;C;2xtx)nOB&Kt;ghTKs+-|&HWGX-LEB0zrqj*2NNMb8W(*C` zD28>!+|RJx!?PRkGk0G{t>F8uNT#ok&0*J8 zo+cpvIvqw0Pa zxVX)^BYNHJ(KJtF zVxX*EU1^I5m%t{nSQA~t5XO`XrV5p=tOwzKMlc&u6^R$7r!( zgG-}7{RqP;zC4!4g!{H&`3sO4H^HG;*q=c6tKCYs!lfX@SQ>k3EM+AQj$T`#oj%o; z6LR5te9d2kF~~U(uT%VP>-xhL{>MJbW>`~@jb}cai3kxjtSlAWX;-;Ofy>B8;l)vW zuX-wUO#h`n5SN8bBd8JKkh!HeIn=)pE~{mq8^NBPpfxklLVQ?=uh;Yd3m@zUANPK-V;I`XqONxr8pqK)@eRmqsO;jl8wF>hEJ8c|c;#c~~`G?I2v z^I%OOATMA|cLbhGFLri@DyG?$V6wioACA3b?@FRoQ|H$V)!QxwxceQ;=2jM%``a{Y zL5qA{7ONkR`>MZ$k~zv9HVHu`9aDQVLC3kJKPOW788VD*QzbfA(unH#r7wq9=#1&4 zPtZxL3;V2UN~+_pE?egA7Bi-Z9w{EdTJLW8%*KS|#eb>@ErxvIdzHvA3KTdJcn8@I z26~?^cWDV!Nki+2y6YVU@e9H zt~SiM5q;dqgiful&ymkJrIFeVa2l4j1uHYh2;db#>GH7d?<%mlOk062lHI2ovYp-mBjIJPEP;HNM8K`&b1d1qX{x^!8vh zwM(`T93I5cIrd5a4Gd<%3}j1=zUQaad|NW_Z_ri<+wS{7@88sFXC*p{%LC<+w*mq5sDhe-1dB+0ylb zQUal14@y2L8}Rn2jHH(g;tI4=DgB* z^qCA5>wS{b1D4A!oO^{Pvw&V(pf}xR!PaX^8?)(?%A478*@71wRsSOiR&|6UY z*66b!o18-ep#)j8U(0pm?x~pY&j)B_BLZvlmZ;-(bE2O~#i?vB32UsI($Z~;7279e zrMvMXj;fWOv)|Pqe<*WzF$66*7y9=tFO6@LW{Ty)H&;`I#2r!mnrDchNe)D7bV0!6 z$O+eRVjfRoR!LjGTDY>OR}7P<@rNXu9l&De`wf%?yAtmX69eEf4kV@-8(QWx3z#nv zeLB@n+B%?RTMBkE`kxvpZamshFLg_T*>pb~UvuSZ%562OU7We}p+(5~1le`cpY6xi zI`_R`f&C0|fZkt(GLZGXuUV`kW!8WHpz~@tmaH6XxXRQkrAH#*OcW%!4Gu@AOTB%B z3w(a+`sS>DZur|Hw$68SFCz_aA)0ww=j8ZG6Fg}*+*D%m49hS|1$65$Ypz=>k{QrR zQ|oOOH%VC3t3{s*)U^q!+}W+3!@PR`c$A-nvZfrUrYRsieXddYT+HIuYs_dDxfa`( zhaPXBH*px&WsSWvimQ9z@5Xi+_h6DHBPdcGk-$=*$Hz#e49wO+!Fb-;jW_ z_?-{mP|tgQ0dC!UI3VwPbR2KV=toz@Ayz`c>Q2M5c&f1Hg(bH~O4Zx1{f1FY<2ys7 z6Ab}Q7yjBMTdu}*$aC5aDoljY=&k)7E3KvA2M`N0xr<>U63F-p)-#}I-|u7t2+Dwe z@;*G`Qbf6A@9Lwv2Pss~IFd1vOfF~mnMk6?1k^J$Vq0`AuGX&~5st1)`{FzseFi`8 z#Zp7O35rQoSOmzs86J=q#@=0z=-Lw*c@-x&x6t8h7hfC)!XW)59$$go~Pq5Y?7e=COi$Ey8DDizc0lor=7|4j66*Qo{6 XGXgo1U}SIL%OisetEnabled(subscription.isValid()); // Track the price changes + +//! [connect-price-changed] QObject::connect(&subscription, &Subscription::priceChanged, [&] { priceDisplay->setText(QString::number(subscription.price())); }); +//! [connect-price-changed] +//! [connect-validity-changed] QObject::connect(&subscription, &Subscription::isValidChanged, [&] { priceDisplay->setEnabled(subscription.isValid()); }); +//! [connect-validity-changed] +//! [connect-user] QObject::connect(&user, &User::countryChanged, [&] { subscription.calculatePrice(); subscription.updateValidity(); @@ -122,6 +131,7 @@ int main(int argc, char *argv[]) QObject::connect(&user, &User::ageChanged, [&] { subscription.updateValidity(); }); +//! [connect-user] w.show(); return a.exec(); diff --git a/examples/corelib/bindableproperties/subscription/subscription.cpp b/examples/corelib/bindableproperties/subscription/subscription.cpp index 7f6da358625..20efe825f32 100644 --- a/examples/corelib/bindableproperties/subscription/subscription.cpp +++ b/examples/corelib/bindableproperties/subscription/subscription.cpp @@ -56,6 +56,8 @@ Subscription::Subscription(User *user) : m_user(user) Q_ASSERT(user); } +//! [calculate-price] + void Subscription::calculatePrice() { const auto oldPrice = m_price; @@ -65,6 +67,10 @@ void Subscription::calculatePrice() emit priceChanged(); } +//! [calculate-price] + +//! [set-duration] + void Subscription::setDuration(Duration newDuration) { if (newDuration != m_duration) { @@ -74,6 +80,10 @@ void Subscription::setDuration(Duration newDuration) } } +//! [set-duration] + +//! [calculate-discount] + double Subscription::calculateDiscount() const { switch (m_duration) { @@ -88,6 +98,10 @@ double Subscription::calculateDiscount() const return -1; } +//! [calculate-discount] + +//! [calculate-base-price] + int Subscription::basePrice() const { if (m_user->country() == User::None) @@ -96,6 +110,10 @@ int Subscription::basePrice() const return (m_user->country() == User::Norway) ? 100 : 80; } +//! [calculate-base-price] + +//! [update-validity] + void Subscription::updateValidity() { bool isValid = m_isValid; @@ -104,3 +122,5 @@ void Subscription::updateValidity() if (m_isValid != isValid) emit isValidChanged(); } + +//! [update-validity] diff --git a/examples/corelib/bindableproperties/subscription/subscription.h b/examples/corelib/bindableproperties/subscription/subscription.h index 95b840bbe53..41d052e86ff 100644 --- a/examples/corelib/bindableproperties/subscription/subscription.h +++ b/examples/corelib/bindableproperties/subscription/subscription.h @@ -56,6 +56,8 @@ class User; +//! [subscription-class] + class Subscription : public QObject { Q_OBJECT @@ -88,4 +90,6 @@ private: bool m_isValid = false; }; +//! [subscription-class] + #endif // SUBSCRIPTION_H diff --git a/examples/corelib/bindableproperties/subscription/user.cpp b/examples/corelib/bindableproperties/subscription/user.cpp index af97576cc73..c2b08353304 100644 --- a/examples/corelib/bindableproperties/subscription/user.cpp +++ b/examples/corelib/bindableproperties/subscription/user.cpp @@ -50,6 +50,8 @@ #include "user.h" +//! [user-setters] + void User::setCountry(Country country) { if (m_country != country) { @@ -65,3 +67,5 @@ void User::setAge(int age) emit ageChanged(); } } + +//! [user-setters] diff --git a/examples/corelib/bindableproperties/subscription/user.h b/examples/corelib/bindableproperties/subscription/user.h index a872ecf8c88..8c9ebb10095 100644 --- a/examples/corelib/bindableproperties/subscription/user.h +++ b/examples/corelib/bindableproperties/subscription/user.h @@ -53,6 +53,8 @@ #include +//! [user-class] + class User : public QObject { Q_OBJECT @@ -79,4 +81,6 @@ private: Country m_country = Country::None; int m_age = 0; }; + +//! [user-class] #endif // USER_H diff --git a/src/corelib/doc/src/objectmodel/bindableproperties.qdoc b/src/corelib/doc/src/objectmodel/bindableproperties.qdoc index dc83c01e3db..391ce4baf7e 100644 --- a/src/corelib/doc/src/objectmodel/bindableproperties.qdoc +++ b/src/corelib/doc/src/objectmodel/bindableproperties.qdoc @@ -45,6 +45,20 @@ uses the encapsulating QObject to store the pointer to the management data structure. + \section1 Why Use Bindable Properties? + + Property bindings are one of the core features of QML. They allow to specify + relationships between different object properties and automatically update + properties' values whenever their dependencies change. Bindable properties + allow to achieve the same not only in QML code, but also in C++. Using + bindable properties can help to simplify your program, by eliminating a lot + of boilerplate code for tracking and reacting to dependency updates of + different objects. + + The \l {Introductory Example} below demonstrates the usage of bindable + properties in C++ code. You can also check \l {Bindable Properties Example} + to see how the bindable properties can help to improve your code. + \section1 Introductory Example The binding expression computes the value by reading other QProperty values.