ãã®åºçç©ã®ç®çã¯ã Qtã®ææ°ããŒãžã§ã³ã§ã®ã¢ãã€ã«éçºã«ã€ããŠèªè ã«ç¥ãããããšã§ããã¯ã©ã€ã¢ã³ããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªèŠçŽ ã®å®è£ ã瀺ããQtã©ã€ãã©ãªãæäœããéã«èãããããèœãšãç©Žãã匷調ããŸãã
å¿ èŠãªãã¬ãŒãã³ã°ãšçµéšã®ã¬ãã«ã¯æå°éã§ãïŒC ++ã®åºæ¬ã«é¢ããç¥èãããŒã«ã«ãµãŒããŒãæ§æããåºæ¬çãªèœåïŒã
èªèã容æã«ããããã®è³æã¯ããèœãšãç©Žãã1ã€ã®ãããžã§ã¯ãã®æŽå²ãšãšã©ãŒã«é¢ããäœæ¥ãã¯ã©ã€ã¢ã³ã/ãµãŒããŒéçºã®åºæ¬ãèŠçŽã®4ã€ã®éšåã«åãããŠããŸãã
1.ãèœãšãç©Žã
1.1ã ç°ãªãããŒãžã§ã³ã®ã©ã€ãã©ãªã®éäºææ§ã
Qtã¯éåžžã«é »ç¹ã«æŽæ°ãããŸãããããã¯äžæ¹ã§ã¯è¯ãããšã§ãããäžæ¹ã§ã¯éçºãæªå€¢ã«ãªãããšããããŸãã ããã¯ãæ°ããããŒãžã§ã³ã«ã¯åããŒãžã§ã³ïŒã¡ãžã£ãŒããŒãžã§ã³ãæå³ããïŒãšã®äºææ§ããªãããã®æ©èœã®äžéšã¯æè¯ã®å Žåã¯å»æ¢ãããææªã®å Žåã¯ã¢ã¯ã»ã¹ã§ããªããªãããã§ãã ãã®çµæãããŒãžã§ã³5.3ã§äœ¿çšã§ããªãWebäžã®ç¡é¢ä¿ãªè³æ/äŸãè±å¯ã«ãããŸãã äžè¬ã«ãæ®å¿µãªããšã«ãQt 5.3ã®æçšãªæ å ±ã¯ãããããã§ããæ€çŽ¢ãšã³ãžã³ã®åé¡ã説æããããã¥ã¡ã³ãïŒããã¥ã¡ã³ãã¯é«å質ã§ãããäžè¬ã«ååãªäžè¬çè«ã¯ãããŸããïŒãŸãã¯ããŒãžã§ã³4.6ãŸãã¯4.8ã®äŸãåç §ããŸãã Qt 5.3ã«ã¯åœ¹ã«ç«ããªãã å ¬åŒã®ã¬ã€ããšäŸã¯ãåºæ¬çã«éåžžã«äºçŽ°ãªã±ãŒã¹ãåºæ¬çã«èª¬æããŠããŸãããååãšããŠãã»ãšãã©ééããããšã¯ãããŸããã æç®ã«ã€ããŠã¯è§ŠããŸããããç©äºã¯ããã«äŒŒãŠããŸãïŒå€ãããŒãžã§ã³ã«é¢é£ïŒã ãã ãããããã®æ¬ ç¹ã¯ã掻çºãªã³ãã¥ããã£ã«ãã£ãŠéšåçã«çžæ®ºãããŠããŸãïŒå ¬åŒãã©ãŒã©ã ã¯qt-project.org/forumsã§ã ïŒã
1.2ã Android / iOSæ©èœã®çã®ãµããŒãã
çŽæ¥èšãã°ãçŸåšãããã®ãã©ãããã©ãŒã çšã®WebViewå®è£ ã¯ãããŸããã ããããææªã®æ¬ ç¹ã§ã¯ãªããããããŸããããä»ã®ãšããã¯ããžãªãããã®ç°¡åãªäœæ¥ãå¿ãã䟡å€ããããŸãã 2çªç®ã®åé¡ã¯ãIMEIããã€ã¹ãååŸã§ããªãããšã§ãïŒããšãã°ããµãŒããŒã«èªèšŒãå®è£ ã§ããŸããïŒãå€ãããŒãžã§ã³ã§ã¯ãQtMobilityã©ã€ãã©ãªããã®ç®çã§äœ¿çšãããŠããŸããããæ°ããããŒãžã§ã³ã§ã¯ã以åã®ããã€ã¹ã®å®å šãªçœ®ãæãã¯ãŸã å®è£ ãããŠããŸããã ãã ãããããã®æ¬ ç¹ã§ãæ¬åœã«è§£æ±ºã§ããŸãããããã«ã¯åãã©ãããã©ãŒã ã®ãã€ãã£ãã¬ãã«ã§ã®ãæ²¡å ¥ããå¿ èŠã§ãïŒããšãã°ãAndroidã§IMEIãååŸãã-habrahabr.ru/sandbox/77966 ïŒããããã¯ããã©ãããã©ãŒã ã«äŸåããªãéçºã®å ã®ã¢ã€ãã¢ãšççŸããŸãã ãŸããéçºç°å¢ïŒQt CreatorïŒã«ããã€ãã®å°ããªãã°ãããããšã«æ³šæããŠãã ãããããšãã°ãIDEãåèµ·åããªããšQMLãã¡ã€ã«ãžã®å€æŽãé©çšãããªãããšããããŸããã
1.3ã ãã°ã®è¿œè·¡ã
ä»ã®éçºè ïŒAndroidãiOSãWebïŒãšã³ãã¥ãã±ãŒã·ã§ã³ããšããªãããC ++ãã¡ã€ã³èšèªãšããŠäœ¿çšããã©ã€ãã©ãªã䜿çšããããªãããã°ã©ããŒããããšããå°è±¡ãåããŸããã å®éãå°ããªã¢ããªã±ãŒã·ã§ã³ãéçºãããšããC ++ã§ã¯ãªãQtèªäœã®ç¹æ§ã®ããã«äžå¿«ãªç¶æ³ã®å€§éšåãçºçããŸããã ååãšããŠããšã©ãŒã¡ãã»ãŒãžã¯ããŸãæ å ±çã§ã¯ãããŸãããããã¡ã€ã«ãèŠã€ãããŸãããããæªå®çŸ©ã®åç §ããªã©ã®ã¡ãã»ãŒãžã®åºåã¯ãåé¡ãååšããå¯èœæ§ãããå ŽåïŒããšãã°ãã¢ãžã¥ãŒã«ã* .proãã¡ã€ã«ã«æ¥ç¶ãããŠããªãå ŽåïŒ ãããã°ã©ã å ã®ãŸã£ããç°ãªãå Žæã§ã®ééã£ãã¡ãœããåŒã³åºããªã©ã ãšã©ãŒã远跡ããã«ã¯ïŒåŸè ãã»ãšãã©ç²ç®çã«æ¢ããªãããã«ïŒããã°ã¯éåžžã«åœ¹ç«ã¡ãŸããqDebugïŒïŒé¢æ°ã¯C ++ã³ãŒãã«ãããconsole.logïŒïŒã¯QMLã«ãããŸãã ãšã©ãŒã®ãããã¯ã¯ãåºçç©ã®æ¬¡ã®ã»ãŒå šäœã«åœãŠãããŠããŸãã
Qtã¯éåžžã«é »ç¹ã«æŽæ°ãããŸãããããã¯äžæ¹ã§ã¯è¯ãããšã§ãããäžæ¹ã§ã¯éçºãæªå€¢ã«ãªãããšããããŸãã ããã¯ãæ°ããããŒãžã§ã³ã«ã¯åããŒãžã§ã³ïŒã¡ãžã£ãŒããŒãžã§ã³ãæå³ããïŒãšã®äºææ§ããªãããã®æ©èœã®äžéšã¯æè¯ã®å Žåã¯å»æ¢ãããææªã®å Žåã¯ã¢ã¯ã»ã¹ã§ããªããªãããã§ãã ãã®çµæãããŒãžã§ã³5.3ã§äœ¿çšã§ããªãWebäžã®ç¡é¢ä¿ãªè³æ/äŸãè±å¯ã«ãããŸãã äžè¬ã«ãæ®å¿µãªããšã«ãQt 5.3ã®æçšãªæ å ±ã¯ãããããã§ããæ€çŽ¢ãšã³ãžã³ã®åé¡ã説æããããã¥ã¡ã³ãïŒããã¥ã¡ã³ãã¯é«å質ã§ãããäžè¬ã«ååãªäžè¬çè«ã¯ãããŸããïŒãŸãã¯ããŒãžã§ã³4.6ãŸãã¯4.8ã®äŸãåç §ããŸãã Qt 5.3ã«ã¯åœ¹ã«ç«ããªãã å ¬åŒã®ã¬ã€ããšäŸã¯ãåºæ¬çã«éåžžã«äºçŽ°ãªã±ãŒã¹ãåºæ¬çã«èª¬æããŠããŸãããååãšããŠãã»ãšãã©ééããããšã¯ãããŸããã æç®ã«ã€ããŠã¯è§ŠããŸããããç©äºã¯ããã«äŒŒãŠããŸãïŒå€ãããŒãžã§ã³ã«é¢é£ïŒã ãã ãããããã®æ¬ ç¹ã¯ã掻çºãªã³ãã¥ããã£ã«ãã£ãŠéšåçã«çžæ®ºãããŠããŸãïŒå ¬åŒãã©ãŒã©ã ã¯qt-project.org/forumsã§ã ïŒã
1.2ã Android / iOSæ©èœã®çã®ãµããŒãã
çŽæ¥èšãã°ãçŸåšãããã®ãã©ãããã©ãŒã çšã®WebViewå®è£ ã¯ãããŸããã ããããææªã®æ¬ ç¹ã§ã¯ãªããããããŸããããä»ã®ãšããã¯ããžãªãããã®ç°¡åãªäœæ¥ãå¿ãã䟡å€ããããŸãã 2çªç®ã®åé¡ã¯ãIMEIããã€ã¹ãååŸã§ããªãããšã§ãïŒããšãã°ããµãŒããŒã«èªèšŒãå®è£ ã§ããŸããïŒãå€ãããŒãžã§ã³ã§ã¯ãQtMobilityã©ã€ãã©ãªããã®ç®çã§äœ¿çšãããŠããŸããããæ°ããããŒãžã§ã³ã§ã¯ã以åã®ããã€ã¹ã®å®å šãªçœ®ãæãã¯ãŸã å®è£ ãããŠããŸããã ãã ãããããã®æ¬ ç¹ã§ãæ¬åœã«è§£æ±ºã§ããŸãããããã«ã¯åãã©ãããã©ãŒã ã®ãã€ãã£ãã¬ãã«ã§ã®ãæ²¡å ¥ããå¿ èŠã§ãïŒããšãã°ãAndroidã§IMEIãååŸãã-habrahabr.ru/sandbox/77966 ïŒããããã¯ããã©ãããã©ãŒã ã«äŸåããªãéçºã®å ã®ã¢ã€ãã¢ãšççŸããŸãã ãŸããéçºç°å¢ïŒQt CreatorïŒã«ããã€ãã®å°ããªãã°ãããããšã«æ³šæããŠãã ãããããšãã°ãIDEãåèµ·åããªããšQMLãã¡ã€ã«ãžã®å€æŽãé©çšãããªãããšããããŸããã
1.3ã ãã°ã®è¿œè·¡ã
ä»ã®éçºè ïŒAndroidãiOSãWebïŒãšã³ãã¥ãã±ãŒã·ã§ã³ããšããªãããC ++ãã¡ã€ã³èšèªãšããŠäœ¿çšããã©ã€ãã©ãªã䜿çšããããªãããã°ã©ããŒããããšããå°è±¡ãåããŸããã å®éãå°ããªã¢ããªã±ãŒã·ã§ã³ãéçºãããšããC ++ã§ã¯ãªãQtèªäœã®ç¹æ§ã®ããã«äžå¿«ãªç¶æ³ã®å€§éšåãçºçããŸããã ååãšããŠããšã©ãŒã¡ãã»ãŒãžã¯ããŸãæ å ±çã§ã¯ãããŸãããããã¡ã€ã«ãèŠã€ãããŸãããããæªå®çŸ©ã®åç §ããªã©ã®ã¡ãã»ãŒãžã®åºåã¯ãåé¡ãååšããå¯èœæ§ãããå ŽåïŒããšãã°ãã¢ãžã¥ãŒã«ã* .proãã¡ã€ã«ã«æ¥ç¶ãããŠããªãå ŽåïŒ ãããã°ã©ã å ã®ãŸã£ããç°ãªãå Žæã§ã®ééã£ãã¡ãœããåŒã³åºããªã©ã ãšã©ãŒã远跡ããã«ã¯ïŒåŸè ãã»ãšãã©ç²ç®çã«æ¢ããªãããã«ïŒããã°ã¯éåžžã«åœ¹ç«ã¡ãŸããqDebugïŒïŒé¢æ°ã¯C ++ã³ãŒãã«ãããconsole.logïŒïŒã¯QMLã«ãããŸãã ãšã©ãŒã®ãããã¯ã¯ãåºçç©ã®æ¬¡ã®ã»ãŒå šäœã«åœãŠãããŠããŸãã
2. 1ã€ã®ãããžã§ã¯ãã®æŽå²ãšãã°ã«é¢ããäœæ¥
ãã®éšåã¯ãå°ããªã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã«ç¯ããééãã«ã€ããŠã§ãã 次ã®ããŒãã§ææ¡ãããœãªã¥ãŒã·ã§ã³ãžã®ãã¹ãããã§èª¬æããŸãã ãã®ã»ã¯ã·ã§ã³ã¯èªã¿é£ã°ããŠãåé¡ãªãã¹ãããã§ããŸãã
ç®æšã«é¢ããè«æïŒä»¥äžãå¯èœã«ããã¢ããªã±ãŒã·ã§ã³ïŒ
-ãµãŒãã¹ã«ç»é²ããŸãã
-ãã°ã€ã³;
-衚瀺ãªã¹ã;
-ãµãŒããŒã«èŠæ±ãéä¿¡ããåä¿¡ããå¿çã解æããŸãã
äžè¬çã«ããã¹ãŠãéåžžã«ç°¡åã§ãã Androidã§ã®éçºã«ã€ããŠç¥ã£ãŠããã€ãã£ãªã ã䜿çšãããã£ãã®ã§ããã€ãŸããããžãã¯ãšUIãåé¢ãããã¹ãŠã1ã€ã®ã³ãŒãã§èšè¿°ããªãããã«ããŸããã Qtã®UIãã©ãŒã [1]ãèŠãŠããã®ãããªããã¹ã¯ãããããã¥ãŒã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯é©ããªããšå€æããŸããã倧ããªç»é¢ãåããããã€ã¹ã§ããäžéšã®èŠçŽ ã«å°éããã®ã¯å°é£ã§ãã UIãã©ãŒã ã®ã¹ã¿ã€ã«ã«æ²¡é ããããªãã£ãã®ã§ãã¬ã€ã¢ãŠããšãã¶ã€ã³ã®ããã«QMLãã¡ã€ã«ã䜿çšããããšã«ããŸããïŒè©³çŽ°ã«ã€ããŠã¯æ¬¡ã®ããŒãã§èª¬æããŸãïŒã
1. Androidããã€ã¹ã§ã®UIãã©ãŒã ã®å€èŠ³ã
QMLã§äœæãããã€ã³ã¿ãŒãã§ãŒã¹ãC ++ããã¯ãšã³ãã«æ¥ç¶ããããã«ããã®äŸ-habrahabr.ru/post/138837ã䜿çšããŸãã ã è¯ãåäœäŸïŒã»ãšãã©ã®å Žåãèè ã¯Qtã«åºäŒã£ããšããšåãåé¡ã«ééããŸããïŒã ãã ãããã®äŸã§äœ¿çšãããŠããQtããŒãžã§ã³ïŒ4.7.4ïŒãå»æ¢ããããããå°æ¥ãããã€ãã®åé¡ãçºçããŸããã ãããã®æåã®ãã®ã¯ãAndroidã§å®è¡ããŠãããšãã®å·šå€§ãªListViewãã¬ãŒãã§ãã ãã®çç±ã¯ãå€ãããŒãžã§ã³ã®QMLïŒQtQuick 1.0ïŒã§ãã
ä¿®æ£ããQMLã®ã€ã³ããŒããQtQuick 1.0ãã2.2ã«å€æŽããŸãã QtDeclarative / QDeclarativeViewã䜿çšããå€ãããã¯ãšã³ãã¯QtQuick 1.0ã«ã®ã¿é¢é£ããããããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã ããçŽã-qt-project.org/doc/qt-5/qtquick-porting-qt5.html äžè¬ã«ãQtQuick 1.0ã¯ã¢ãã€ã«ãã©ãããã©ãŒã ã«ããŸã銎æã¿ããããŸãããããšãã°ãå ¥åäžã«ããŒããŒãã衚瀺ããããšããªã©ãå¥åŠãªç¹ããããŸãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããŒããŒããšåæã«å®å šã«èŠããããã«2åå§çž®ããããããã®ãµã€ãºãç¶æããŸãããã®ãããããŒããŒãã®åŸãã®ç»é¢ã®ååãèŠããªããªããŸããã QtQuick 2.2ã¯ãã®ç¹ã§å¬ããé©ããŸãããå ¥åãéãããšãã«ãæªã¿ããªããå ¥åãã£ãŒã«ããèŠçãã倱ãããªãããã«ãé¢å¿ãç©ããã«åŒãäžããããããã§ãã
ããã§ãã¹ãŠãããŸãããããã«èŠããListViewã¯é£ã³ãŸãããæ°ããé©ããçŸããŸãã æåã¯ãåãŠã£ã³ããŠã«ïŒQMLãã¡ã€ã«ã䜿çšããŠïŒãã€ã³ããããã€ã³ã¿ãŒãã§ã€ã¹ãæã€ç¬èªã®ã¯ã©ã¹ãå«ãŸããããã«ã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã æ°ãããŠã£ã³ããŠãéããšã察å¿ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ãŠã£ã³ããŠãäžéšã«è¡šç€ºãããå€ããŠã£ã³ããŠã¯ã©ãã«ãæ¶ããŸããã çŸåšã®ãŠã£ã³ããŠãéãããšãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãåé€ãããåã®ãŠã£ã³ããŠãåã³è¡šç€ºãããŸãã Androidã®ããã€ãã®ããã¯ã¹ã¿ãã¯ã¢ã¯ãã£ããã£ã®ãããªãã®ã é©ããããšã«ãQtQuick 2.2ã§ã¯ããã¯äžå¯èœã«ãªããŸããïŒãã®å ŽåãAndroidã§éçãªç°è²ã®ç»é¢ã衚瀺ãããã ãã§ãïŒã çç±ã¯bugreport-bugreports.qt-project.org/browse/QTBUG-39454ã«ãããŸãã äžçªäžã®è¡ïŒAndroidã§äœ¿çšã§ããOpenGLãŠã£ã³ããŠã¯1ã€ã ãã§ãïŒQtQuick 2.2ã¯ããã䜿çšããã ãã§ãïŒã iOSã§ã¯ããŠã£ã³ããŠã衚瀺ãããŸãããããã®æšªæ ã衚瀺ãããŸããã æ®å¿µãªãããç§ã¯æãŸããã€ãã£ãªã ãæåŠããªããã°ãªããŸããã§ããã ããã§ã1ã€ã®ã¡ã€ã³QMLãã¡ã€ã«ãïŒQQmlApplicationEngineãä»ããŠïŒäœ¿çšãããç°ãªããŠã£ã³ããŠãšãããã®éã®é·ç§»ãããŒããŒã«ãã£ãŠå®è¡ãããŸãïŒæ¬¡ã®éšåã§ããã«ã€ããŠïŒã ãã以äžè©³ããã¯èª¬æããŸãããJSONãHttpPostãªã¯ãšã¹ãã®è§£ææ¹æ³ãããŒããŒãã§ã¯è¡šç€ºãããªã/äžæ¬æãªãžã£ã ã®è§£æ±ºæ¹æ³ãQMLã§ããã¯ã¹ã¿ãã¯ã®ããã«ããã²ãŒã·ã§ã³ãäœæããæ¹æ³ïŒãæåããã¬ã¹åŠçãã¿ã³ãæ»ããïŒããã³ããã€ãã®ãšã³ãã£ãã£ã
ç®æšã«é¢ããè«æïŒä»¥äžãå¯èœã«ããã¢ããªã±ãŒã·ã§ã³ïŒ
-ãµãŒãã¹ã«ç»é²ããŸãã
-ãã°ã€ã³;
-衚瀺ãªã¹ã;
-ãµãŒããŒã«èŠæ±ãéä¿¡ããåä¿¡ããå¿çã解æããŸãã
äžè¬çã«ããã¹ãŠãéåžžã«ç°¡åã§ãã Androidã§ã®éçºã«ã€ããŠç¥ã£ãŠããã€ãã£ãªã ã䜿çšãããã£ãã®ã§ããã€ãŸããããžãã¯ãšUIãåé¢ãããã¹ãŠã1ã€ã®ã³ãŒãã§èšè¿°ããªãããã«ããŸããã Qtã®UIãã©ãŒã [1]ãèŠãŠããã®ãããªããã¹ã¯ãããããã¥ãŒã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯é©ããªããšå€æããŸããã倧ããªç»é¢ãåããããã€ã¹ã§ããäžéšã®èŠçŽ ã«å°éããã®ã¯å°é£ã§ãã UIãã©ãŒã ã®ã¹ã¿ã€ã«ã«æ²¡é ããããªãã£ãã®ã§ãã¬ã€ã¢ãŠããšãã¶ã€ã³ã®ããã«QMLãã¡ã€ã«ã䜿çšããããšã«ããŸããïŒè©³çŽ°ã«ã€ããŠã¯æ¬¡ã®ããŒãã§èª¬æããŸãïŒã

1. Androidããã€ã¹ã§ã®UIãã©ãŒã ã®å€èŠ³ã
QMLã§äœæãããã€ã³ã¿ãŒãã§ãŒã¹ãC ++ããã¯ãšã³ãã«æ¥ç¶ããããã«ããã®äŸ-habrahabr.ru/post/138837ã䜿çšããŸãã ã è¯ãåäœäŸïŒã»ãšãã©ã®å Žåãèè ã¯Qtã«åºäŒã£ããšããšåãåé¡ã«ééããŸããïŒã ãã ãããã®äŸã§äœ¿çšãããŠããQtããŒãžã§ã³ïŒ4.7.4ïŒãå»æ¢ããããããå°æ¥ãããã€ãã®åé¡ãçºçããŸããã ãããã®æåã®ãã®ã¯ãAndroidã§å®è¡ããŠãããšãã®å·šå€§ãªListViewãã¬ãŒãã§ãã ãã®çç±ã¯ãå€ãããŒãžã§ã³ã®QMLïŒQtQuick 1.0ïŒã§ãã
ä¿®æ£ããQMLã®ã€ã³ããŒããQtQuick 1.0ãã2.2ã«å€æŽããŸãã QtDeclarative / QDeclarativeViewã䜿çšããå€ãããã¯ãšã³ãã¯QtQuick 1.0ã«ã®ã¿é¢é£ããããããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã ããçŽã-qt-project.org/doc/qt-5/qtquick-porting-qt5.html äžè¬ã«ãQtQuick 1.0ã¯ã¢ãã€ã«ãã©ãããã©ãŒã ã«ããŸã銎æã¿ããããŸãããããšãã°ãå ¥åäžã«ããŒããŒãã衚瀺ããããšããªã©ãå¥åŠãªç¹ããããŸãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããŒããŒããšåæã«å®å šã«èŠããããã«2åå§çž®ããããããã®ãµã€ãºãç¶æããŸãããã®ãããããŒããŒãã®åŸãã®ç»é¢ã®ååãèŠããªããªããŸããã QtQuick 2.2ã¯ãã®ç¹ã§å¬ããé©ããŸãããå ¥åãéãããšãã«ãæªã¿ããªããå ¥åãã£ãŒã«ããèŠçãã倱ãããªãããã«ãé¢å¿ãç©ããã«åŒãäžããããããã§ãã
ããã§ãã¹ãŠãããŸãããããã«èŠããListViewã¯é£ã³ãŸãããæ°ããé©ããçŸããŸãã æåã¯ãåãŠã£ã³ããŠã«ïŒQMLãã¡ã€ã«ã䜿çšããŠïŒãã€ã³ããããã€ã³ã¿ãŒãã§ã€ã¹ãæã€ç¬èªã®ã¯ã©ã¹ãå«ãŸããããã«ã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã æ°ãããŠã£ã³ããŠãéããšã察å¿ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ãŠã£ã³ããŠãäžéšã«è¡šç€ºãããå€ããŠã£ã³ããŠã¯ã©ãã«ãæ¶ããŸããã çŸåšã®ãŠã£ã³ããŠãéãããšãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãåé€ãããåã®ãŠã£ã³ããŠãåã³è¡šç€ºãããŸãã Androidã®ããã€ãã®ããã¯ã¹ã¿ãã¯ã¢ã¯ãã£ããã£ã®ãããªãã®ã é©ããããšã«ãQtQuick 2.2ã§ã¯ããã¯äžå¯èœã«ãªããŸããïŒãã®å ŽåãAndroidã§éçãªç°è²ã®ç»é¢ã衚瀺ãããã ãã§ãïŒã çç±ã¯bugreport-bugreports.qt-project.org/browse/QTBUG-39454ã«ãããŸãã äžçªäžã®è¡ïŒAndroidã§äœ¿çšã§ããOpenGLãŠã£ã³ããŠã¯1ã€ã ãã§ãïŒQtQuick 2.2ã¯ããã䜿çšããã ãã§ãïŒã iOSã§ã¯ããŠã£ã³ããŠã衚瀺ãããŸãããããã®æšªæ ã衚瀺ãããŸããã æ®å¿µãªãããç§ã¯æãŸããã€ãã£ãªã ãæåŠããªããã°ãªããŸããã§ããã ããã§ã1ã€ã®ã¡ã€ã³QMLãã¡ã€ã«ãïŒQQmlApplicationEngineãä»ããŠïŒäœ¿çšãããç°ãªããŠã£ã³ããŠãšãããã®éã®é·ç§»ãããŒããŒã«ãã£ãŠå®è¡ãããŸãïŒæ¬¡ã®éšåã§ããã«ã€ããŠïŒã ãã以äžè©³ããã¯èª¬æããŸãããJSONãHttpPostãªã¯ãšã¹ãã®è§£ææ¹æ³ãããŒããŒãã§ã¯è¡šç€ºãããªã/äžæ¬æãªãžã£ã ã®è§£æ±ºæ¹æ³ãQMLã§ããã¯ã¹ã¿ãã¯ã®ããã«ããã²ãŒã·ã§ã³ãäœæããæ¹æ³ïŒãæåããã¬ã¹åŠçãã¿ã³ãæ»ããïŒããã³ããã€ãã®ãšã³ãã£ãã£ã
3.ã¯ã©ã€ã¢ã³ã/ãµãŒããŒéçºã®åºæ¬
ããã§ã¯ãQtã§é ãå£ã«å°ããã³ãããåŸã®è§£æ±ºæ¹æ³ã説æããŸãã ããã¯æ¬æžã®äž»èŠéšåã§ãã
ããã§éå§ããæºåãã§ããŸããïŒ Qt 5.3ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããããšãåæãšããŠããŸã-qt-project.org/downloadsãJDKãAndroid SDKãNDKãapache-antã¯Androidã§ã³ã³ãã€ã«ããããã«ããŠã³ããŒããããŸãïŒQt Creatorèšå®ã§ãã¹ãæå®ããå¿ èŠããããŸãïŒãiOSã®å Žå-XCODE ã
ããã§éå§ããæºåãã§ããŸããïŒ Qt 5.3ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããããšãåæãšããŠããŸã-qt-project.org/downloadsãJDKãAndroid SDKãNDKãapache-antã¯Androidã§ã³ã³ãã€ã«ããããã«ããŠã³ããŒããããŸãïŒQt Creatorèšå®ã§ãã¹ãæå®ããå¿ èŠããããŸãïŒãiOSã®å Žå-XCODE ã
3.1ã ãããžã§ã¯ãã®äœæãšæºå
Qt Creatorãèµ·åãã[æ°ãããããžã§ã¯ã]ãã¯ãªãã¯ããŸãã ãQt Quick ApplicationããéžæããŸãïŒ
ååã«éãããªãããã«ããããžã§ã¯ããããµã³ãã«ããšåŒã³ãŸãïŒãããžã§ã¯ãã®ååãšãã®ãã¹ã«ããªã«æåã䜿çšããããšã¯ã§ããŸããïŒã
Qt Quickã³ã³ããŒãã³ãã®ã»ããã¯ãQt Quick Controls 1.1ã«æ®ããŸãã
Qt Quick Controls 1.1ã¯ãQt Quick 2.2ã®åºæ¬èŠçŽ ã«å ããŠãããŸããŸãªæ©èœã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ïŒã³ã³ãããŒã«ïŒãå«ãã©ã€ãã©ãªã®ã»ããã§ãã ããã§ã¯ãã³ã³ãããŒã«ã䜿çšãããšã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºã3ã¡ã¬ãã€ãå¢å ããããšãããã«äºçŽããŸããç§ã®å Žåãã³ã³ãããŒã«ãå«ãåéãããapkãã¡ã€ã«ã®ééã¯11.6 MBã§ããã ç§ã®æèŠã§ã¯ããã©ã¹ã³ã³ãããŒã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®èµ·åãé ãããŸãïŒãã ããåé¡ã¯ããŒããŒãŸãã¯ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ã§è§£æ±ºã§ããŸãïŒã ãã ãããããã䜿çšãããšéçºãç°¡çŽ åããããããããããæŸæ£ããŸããã
次ã«-ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã©ãããã©ãŒã ãéžæããŸãã
å¿ èŠãªãã©ãããã©ãŒã ã®ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸããã€ã³ã¹ããŒã«ãããã©ãããã©ãŒã ã«é¢ä¿ãªãããã¹ã¯ãããããã§ãã¯ããããšããå§ãããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ã¯ãããã§æãéãå®è¡ãããããããã¹ãã«äŸ¿å©ã§ãã
ããŒãžã§ã³ç®¡çã®æ¥ç¶ã¯åæ¢ããŸããïŒãã®äŸã§ã¯ç°¡åã«å®è¡ã§ããŸããããã®äŸã§ã¯å¿ èŠãããŸããïŒã[å®äº]ãã¯ãªãã¯ããã ãã§ãã
ãããžã§ã¯ããäœæãããŸããïŒ äœã§æ§æãããŠããŸããïŒ
ãããžã§ã¯ãããªãŒãèŠãŠã¿ãŸãããã ãŸã第äžã«ãç§ãã¡ãå¿ èŠãšããäœæ¥ã§ã¯ïŒ
-æ§æ* .proãã¡ã€ã«ïŒSample.proïŒïŒAndroidã®ãããã§ã¹ããã¡ã€ã«ã«äŒŒããã®ã
-ãœãŒã¹ã³ãŒããšããããŒãã¡ã€ã«ïŒåŸã§äœæããŸãïŒãã¢ããªã±ãŒã·ã§ã³ããã¯ãšã³ãããããŸãã
-* .qrc-fileïŒqml.qrcïŒïŒãã®äžã«ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®ãªãœãŒã¹ïŒQML-ãã¡ã€ã«ãã€ã¡ãŒãžãªã©ïŒã瀺ããŸãã
-ã€ã³ã¿ãŒãã§ã€ã¹ã®QMLãã¡ã€ã«ïŒãããŸã§ã®ãšãããmain.qmlã®ã¿ããããŸãïŒã
ã¢ããªã±ãŒã·ã§ã³ãä¿åããŠå®è¡ãããšããã¹ã¯ãããã«æ¬¡ã®ãããªãã®ã衚瀺ãããŸãã

ååã«éãããªãããã«ããããžã§ã¯ããããµã³ãã«ããšåŒã³ãŸãïŒãããžã§ã¯ãã®ååãšãã®ãã¹ã«ããªã«æåã䜿çšããããšã¯ã§ããŸããïŒã

Qt Quickã³ã³ããŒãã³ãã®ã»ããã¯ãQt Quick Controls 1.1ã«æ®ããŸãã

Qt Quick Controls 1.1ã¯ãQt Quick 2.2ã®åºæ¬èŠçŽ ã«å ããŠãããŸããŸãªæ©èœã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ïŒã³ã³ãããŒã«ïŒãå«ãã©ã€ãã©ãªã®ã»ããã§ãã ããã§ã¯ãã³ã³ãããŒã«ã䜿çšãããšã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºã3ã¡ã¬ãã€ãå¢å ããããšãããã«äºçŽããŸããç§ã®å Žåãã³ã³ãããŒã«ãå«ãåéãããapkãã¡ã€ã«ã®ééã¯11.6 MBã§ããã ç§ã®æèŠã§ã¯ããã©ã¹ã³ã³ãããŒã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®èµ·åãé ãããŸãïŒãã ããåé¡ã¯ããŒããŒãŸãã¯ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ã§è§£æ±ºã§ããŸãïŒã ãã ãããããã䜿çšãããšéçºãç°¡çŽ åããããããããããæŸæ£ããŸããã
次ã«-ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã©ãããã©ãŒã ãéžæããŸãã

å¿ èŠãªãã©ãããã©ãŒã ã®ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸããã€ã³ã¹ããŒã«ãããã©ãããã©ãŒã ã«é¢ä¿ãªãããã¹ã¯ãããããã§ãã¯ããããšããå§ãããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ã¯ãããã§æãéãå®è¡ãããããããã¹ãã«äŸ¿å©ã§ãã
ããŒãžã§ã³ç®¡çã®æ¥ç¶ã¯åæ¢ããŸããïŒãã®äŸã§ã¯ç°¡åã«å®è¡ã§ããŸããããã®äŸã§ã¯å¿ èŠãããŸããïŒã[å®äº]ãã¯ãªãã¯ããã ãã§ãã

ãããžã§ã¯ããäœæãããŸããïŒ äœã§æ§æãããŠããŸããïŒ

ãããžã§ã¯ãããªãŒãèŠãŠã¿ãŸãããã ãŸã第äžã«ãç§ãã¡ãå¿ èŠãšããäœæ¥ã§ã¯ïŒ
-æ§æ* .proãã¡ã€ã«ïŒSample.proïŒïŒAndroidã®ãããã§ã¹ããã¡ã€ã«ã«äŒŒããã®ã
-ãœãŒã¹ã³ãŒããšããããŒãã¡ã€ã«ïŒåŸã§äœæããŸãïŒãã¢ããªã±ãŒã·ã§ã³ããã¯ãšã³ãããããŸãã
-* .qrc-fileïŒqml.qrcïŒïŒãã®äžã«ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®ãªãœãŒã¹ïŒQML-ãã¡ã€ã«ãã€ã¡ãŒãžãªã©ïŒã瀺ããŸãã
-ã€ã³ã¿ãŒãã§ã€ã¹ã®QMLãã¡ã€ã«ïŒãããŸã§ã®ãšãããmain.qmlã®ã¿ããããŸãïŒã
ã¢ããªã±ãŒã·ã§ã³ãä¿åããŠå®è¡ãããšããã¹ã¯ãããã«æ¬¡ã®ãããªãã®ã衚瀺ãããŸãã

3.2ã ã€ã³ã¿ãŒãã§ã€ã¹äœæ
3.2.1ã ãã¿ã³ãäœæãã
main.qmlãã¡ã€ã«ãéããŸãã ã¿ã€ãã«ãã¡ãã¥ãŒããŒãããã¹ããåé€ããŸãã ãã®çµæã次ã®ããšãã§ããããã«ãªããŸãã
ApplicationWindowã¯ãåãè¿œå ãããã«ãŒãèŠçŽ ã§ãã ã¡ã€ã³QMLãã¡ã€ã«ã«ååšããå¿ èŠããããŸãã ApplicationWindowå ã«idãšobjectNameã®2ã€ã®ãã£ãŒã«ããããã«æžã蟌ã¿ãŸãã
idã¯QMLãã¡ã€ã«å ã®ApplicationWindowã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸããobjectNameã¯C ++ã³ãŒãã§QMLããã¡ã€ã³ãŠã£ã³ããŠãèŠã€ããããã«å¿ èŠã§ãã
åºå®å€ã®å¹ ãšé«ãã®ãã©ã¡ãŒã¿ãŒã¯ä»ã®ãšããæ··åããªãã§ãã ããã ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãæåã«ãã®ãããªå¯žæ³ã§ã®ã¿äœæããããã®åŸã¹ããŒããã©ã³ã®ç»é¢ãµã€ãºãŸã§æ¡å€§ãããŸãã ãã®ãããAndroidã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ç»é¢ããããã«ãããããããŠãããä¿®æ£æ¹æ³ããããŸããæåŸã«èª¬æããŸãã
äžè¬çã«ãæ§æããŒã¹ã®QMLãã¡ã€ã«ã¯ãWebã¬ã€ã¢ãŠããšjavascript-logicã®æ®çºæ§ã®æ··åãé£æ³ãããŸãããé¡äŒŒæ§ã¯éšåçã§ãã QMLã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ãªããããžãã¯ïŒããšãã°ããã©ãŒã ã®å®äºã確èªããã®ã«äŸ¿å©ïŒãäœæã§ããŸãããããã¯ãã©ã¹ã§ãã
ãŠã£ã³ããŠã®è²ãæå®ããŸããããããè¡ãã«ã¯ãApplicationWindowã®ãheightïŒ480ãè¡ã®ããäžã«è¡ãè¿œå ããŸã
16é²ã³ãŒãã§è²ãèšå®ã§ããŸããäžéšã®è²ã¯ãããšãã°ãèµ€ãããéæããªã©ã®ååã§æå®ã§ããŸãã äœæããå®æ°ã䜿çšããããšãã§ããŸãã詳现ã«ã€ããŠã¯ãåŸã§èª¬æããŸãã 次ã«ãã€ã³ããŒãã«è¿œå ããŸãã
ã³ã³ãããŒã«ãã«ã¹ã¿ãã€ãºããã«ã¯ã¹ã¿ã€ã«ãå¿ èŠã«ãªããŸãã ApplicationWindowå ã«ãã¿ã³ãäœæããŸãã äžè¬çãªã³ãŒãïŒ
ãã¿ã³ã®å¹ ã¯ãã¡ã€ã³ãŠã£ã³ããŠã®å¹ ãé«ã-ã¡ã€ã³ç»é¢ã®é«ããåºæºã«ããŠèšç®ãããŸãã ããã§ã¯ããã¿ã³ã®ãµã€ãºãšäœçœ®ãèšç®ããããã®idãåºæ¬åŒã«ãã£ãŠèŠçŽ ã«ã¢ã¯ã»ã¹ããäŸã瀺ããŸã[åç § ãµããªã¡ã³ã1] ã åŒã®ãã©ã¡ãŒã¿ãŒïŒyã«ãã£ãŠèšç®ãããé«ãïŒã®åã«idãæå®ããªãå Žåãå éšã«ããçŸåšã®èŠçŽ ã®ãã©ã¡ãŒã¿ãŒã䜿çšãããŠãããšèŠãªãããŸãã ãã¹ãŠãä¿åããŠå®è¡ããŸãã
ãã¿ã³ã衚瀺ããããã®ãµã€ãºã¯éããŠãããŠã£ã³ããŠïŒãã¹ã¯ãããïŒãŸãã¯ã¢ãã€ã«ããã€ã¹ã®ç»é¢ã®ãµã€ãºã«å¯ŸããŠèšç®ãããŸããããã«ãããããŸããŸãªããã€ã¹ïŒUIãäœæããããã«ã«ã¹ã¿ã ã¯ã©ã¹ã䜿çšããªãå Žåã®Androidã®usuallyæ žãšåãïŒã®åã衚瀺ã®åé¡ã解決ã§ããŸãã
æ°ãããã¿ã³ã®ã¹ã¿ã€ã«ãäœæããŸãããïŒ ãããè¡ãã«ã¯ãButtonå ã«ä»¥äžãè¿œå ããŸãã
ãã¿ã³ã®ã¹ã¿ã€ã«ã¯ãèæ¯ãšã©ãã«ã®2ã€ã®éšåã§æ§æãããŸãã ãããã®éšåãå¥ã®QMLãã¡ã€ã«ã«äœæããŠãã¡ã€ã³ã®éšåãä¹±éã«ãªããªãããã«ããŸãã ãããè¡ãã«ã¯ãQt Creatorãæããããã§ãããžã§ã¯ããã©ã«ããŒã«ç§»åããããã«ãQMLããã©ã«ããŒãäœæããŠãäœæ¥ãã¡ã€ã«ãæŽç¶ãšé 眮ãããããã«ããŸãã
Qt Creatorã«æ»ããŸãã ããªãŒïŒãããžã§ã¯ãïŒã§ãããžã§ã¯ãåãå³ã¯ãªãã¯ããã³ã³ããã¹ãã¡ãã¥ãŒã§[æ°èŠè¿œå ...]ãéžæããŸãã 次ã«ãQtããQMLãã¡ã€ã«ïŒQt Quick 2ïŒããéžæããŸãã
ååã¯ãButtonBackgroundãããã¹ã¯æ°ããäœæããããQMLããã©ã«ããŒãžã®ãã¹ã§ãã
ãã¬ãã£ãã¯ã¹ã確èªããŸããããŒãžã§ã³ç®¡çã¯å¿ èŠãªãããã[å®äº]ãã¯ãªãã¯ããŸãã
åæ§ã«ããButtonLabel.qmlããã¡ã€ã«ãäœæããŸãã ãããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸããã
ãQML / ButtonBackground.qmlããããã«ã¯ãªãã¯ããŠéããŸãã 次ã®ããã«ç·šéããŸãã
é çªã«ïŒ
-anchors.fillïŒparent-ãã¿ã³ã®èæ¯ãå®å šã«å¡ãã€ã¶ãããããã«ããparent-çŸåšã®èŠçŽ ãé 眮ãããŠãã芪èŠçŽ ãžã®ã¢ã¯ã»ã¹ã
-anchors.marginsïŒ4-ãã¹ãŠã®åŽé¢ããå°ããªã€ã³ãã³ããèšå®ããŸãã
-ããŒããŒ-ã¹ãããŒã¯èšå®[åç § ãµããªã¡ã³ã8] ;
-ååŸïŒé«ã/ 4-ããã§ã¯ãã§ã«èå³æ·±ãã§ãã ãã®å Žåãè§ãäžžãããããã«äœ¿çšãããŸãïŒå€ã¯ãã¿ã³ã®é«ãã«å¯ŸããŠåºãããŸãïŒããRectangleã®å¹ ãšé«ããåãã«èšå®ãããšãååã«å€§ããååŸå€ã䜿çšããŠRectangleããåãååŸã§ããŸãã
-åŸé ã¯2ç¹ã§æ§æãããŸãã æåã®ãã€ã³ãïŒãŒãäœçœ®ïŒã«æ³šæããŠãã ãã-ããã§ã¯ããã¿ã³ã®ç¶æ ïŒcontrol.pressedïŒã«åãæ¿ããŠãæŒããããã¿ã³ã«å¿ããŠè²ã決å®ããŸããåçŽãªæ¡ä»¶æŒç®åã䜿çšããŸãã çå®ã®å Žåã®ã¢ã¯ã·ã§ã³ïŒfalseã®å Žåã®ã¢ã¯ã·ã§ã³ã
-ã°ã©ããŒã·ã§ã³ã®ä»£ããã«è²ãèšå®ã§ããŸããããšãã°ãéæ床ïŒäžéæ床ïŒ0ã1ïŒã䜿çšããããšãã§ããŸãã
ãButtonBackground.qmlããä¿åãããmain.qmlãã«æ»ããŸãã äœæããQMLãã©ã«ããŒãã€ã³ããŒãã«è¿œå ããŸãã
ããã§ããã®ãã©ã«ããŒå ã®ãã¹ãŠã®QMLãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããŸãã ãã¿ã³ã¹ã¿ã€ã«ã«æ»ããäœæããã°ããã®èæ¯ãæå®ããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸãã
ãã¹ãŠãä¿åããŠå®è¡ããŸãã
ãã¿ã³ã¯å°ãæãããªããŸãããã眲åããããŸããã ä¿®æ£ããŠãã ããã ãButtonLabel.qmlããéãã次ã®ããã«ç·šéããŸãã
眲åã¯ãã¿ã³æ¬äœãå®å šã«åããäžå€®ã«é 眮ããã倧èãªé¡ãããŠããŸãã 眲åã®ãµã€ãºã¯ãçŸåšã®ç»é¢ã®åããåºæºã«ããŠèšç®ãããŸããå¹ ã倧ããã»ã©æšªåãã«ãªããé«ã-瞊åãã«ãªãã®ã¯è«ççã§ã[åç § è£è¶³2] ã ããã§ã¯ãã¿ã³ããã¹ããã€ã³ã¹ããŒã«ããŸãããããã¯äžäŸ¿ã§ãã
åã³ãmain.qmlããéããŸãã äœæããã°ããã®ãButtonLabelããã©ãã«ã¹ã¿ã€ã«ã«è¿œå ããŸããããã§ã¯ããã¿ã³ããã¹ããããã«ç€ºããŸã[åç § ãµããªã¡ã³ã3] ã 次ã®ããã«ãªããŸãã
ãã¹ãŠãä¿åããŠå®è¡ããŸãã
ã¯ãªãã¯å¯èœãªãã¿ã³ãããã®ã§ãã¯ãªãã¯ãã³ãã©ãŒãè¿œå ããŠããã°ã«ã¡ãã»ãŒãžãåºåããŸãã ãããè¡ãã«ã¯ããã¿ã³å ã«è¡ãè¿œå ããŸãã
åèšã§ïŒ
å®è¡ããŠç¢ºèªããŠãã ããã ãã¢ããªã±ãŒã·ã§ã³åºåãããã«ïŒQt CreatorãŠã£ã³ããŠã®äžçªäžïŒã®ãã¿ã³ãã¯ãªãã¯ãããšãæ°ããè¡ã衚瀺ãããŸãïŒãqmlïŒButton 'Test' clickedãïŒ
ããã§ãä»ã®ãšãããã¿ã³ã§äœæ¥ãçµäºããŸãã
import QtQuick 2.2 import QtQuick.Controls 1.1 ApplicationWindow { visible: true width: 640 height: 480 }
ApplicationWindowã¯ãåãè¿œå ãããã«ãŒãèŠçŽ ã§ãã ã¡ã€ã³QMLãã¡ã€ã«ã«ååšããå¿ èŠããããŸãã ApplicationWindowå ã«idãšobjectNameã®2ã€ã®ãã£ãŒã«ããããã«æžã蟌ã¿ãŸãã
ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 }
idã¯QMLãã¡ã€ã«å ã®ApplicationWindowã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸããobjectNameã¯C ++ã³ãŒãã§QMLããã¡ã€ã³ãŠã£ã³ããŠãèŠã€ããããã«å¿ èŠã§ãã
åºå®å€ã®å¹ ãšé«ãã®ãã©ã¡ãŒã¿ãŒã¯ä»ã®ãšããæ··åããªãã§ãã ããã ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãæåã«ãã®ãããªå¯žæ³ã§ã®ã¿äœæããããã®åŸã¹ããŒããã©ã³ã®ç»é¢ãµã€ãºãŸã§æ¡å€§ãããŸãã ãã®ãããAndroidã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ç»é¢ããããã«ãããããããŠãããä¿®æ£æ¹æ³ããããŸããæåŸã«èª¬æããŸãã
äžè¬çã«ãæ§æããŒã¹ã®QMLãã¡ã€ã«ã¯ãWebã¬ã€ã¢ãŠããšjavascript-logicã®æ®çºæ§ã®æ··åãé£æ³ãããŸãããé¡äŒŒæ§ã¯éšåçã§ãã QMLã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ãªããããžãã¯ïŒããšãã°ããã©ãŒã ã®å®äºã確èªããã®ã«äŸ¿å©ïŒãäœæã§ããŸãããããã¯ãã©ã¹ã§ãã
ãŠã£ã³ããŠã®è²ãæå®ããŸããããããè¡ãã«ã¯ãApplicationWindowã®ãheightïŒ480ãè¡ã®ããäžã«è¡ãè¿œå ããŸã
color: "#F0F0FF"
16é²ã³ãŒãã§è²ãèšå®ã§ããŸããäžéšã®è²ã¯ãããšãã°ãèµ€ãããéæããªã©ã®ååã§æå®ã§ããŸãã äœæããå®æ°ã䜿çšããããšãã§ããŸãã詳现ã«ã€ããŠã¯ãåŸã§èª¬æããŸãã 次ã«ãã€ã³ããŒãã«è¿œå ããŸãã
import QtQuick.Controls.Styles 1.2
ã³ã³ãããŒã«ãã«ã¹ã¿ãã€ãºããã«ã¯ã¹ã¿ã€ã«ãå¿ èŠã«ãªããŸãã ApplicationWindowå ã«ãã¿ã³ãäœæããŸãã äžè¬çãªã³ãŒãïŒ
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height } }
ãã¿ã³ã®å¹ ã¯ãã¡ã€ã³ãŠã£ã³ããŠã®å¹ ãé«ã-ã¡ã€ã³ç»é¢ã®é«ããåºæºã«ããŠèšç®ãããŸãã ããã§ã¯ããã¿ã³ã®ãµã€ãºãšäœçœ®ãèšç®ããããã®idãåºæ¬åŒã«ãã£ãŠèŠçŽ ã«ã¢ã¯ã»ã¹ããäŸã瀺ããŸã[åç § ãµããªã¡ã³ã1] ã åŒã®ãã©ã¡ãŒã¿ãŒïŒyã«ãã£ãŠèšç®ãããé«ãïŒã®åã«idãæå®ããªãå Žåãå éšã«ããçŸåšã®èŠçŽ ã®ãã©ã¡ãŒã¿ãŒã䜿çšãããŠãããšèŠãªãããŸãã ãã¹ãŠãä¿åããŠå®è¡ããŸãã

ãã¿ã³ã衚瀺ããããã®ãµã€ãºã¯éããŠãããŠã£ã³ããŠïŒãã¹ã¯ãããïŒãŸãã¯ã¢ãã€ã«ããã€ã¹ã®ç»é¢ã®ãµã€ãºã«å¯ŸããŠèšç®ãããŸããããã«ãããããŸããŸãªããã€ã¹ïŒUIãäœæããããã«ã«ã¹ã¿ã ã¯ã©ã¹ã䜿çšããªãå Žåã®Androidã®usuallyæ žãšåãïŒã®åã衚瀺ã®åé¡ã解決ã§ããŸãã
æ°ãããã¿ã³ã®ã¹ã¿ã€ã«ãäœæããŸãããïŒ ãããè¡ãã«ã¯ãButtonå ã«ä»¥äžãè¿œå ããŸãã
style: ButtonStyle { }
ãã¿ã³ã®ã¹ã¿ã€ã«ã¯ãèæ¯ãšã©ãã«ã®2ã€ã®éšåã§æ§æãããŸãã ãããã®éšåãå¥ã®QMLãã¡ã€ã«ã«äœæããŠãã¡ã€ã³ã®éšåãä¹±éã«ãªããªãããã«ããŸãã ãããè¡ãã«ã¯ãQt Creatorãæããããã§ãããžã§ã¯ããã©ã«ããŒã«ç§»åããããã«ãQMLããã©ã«ããŒãäœæããŠãäœæ¥ãã¡ã€ã«ãæŽç¶ãšé 眮ãããããã«ããŸãã
Qt Creatorã«æ»ããŸãã ããªãŒïŒãããžã§ã¯ãïŒã§ãããžã§ã¯ãåãå³ã¯ãªãã¯ããã³ã³ããã¹ãã¡ãã¥ãŒã§[æ°èŠè¿œå ...]ãéžæããŸãã 次ã«ãQtããQMLãã¡ã€ã«ïŒQt Quick 2ïŒããéžæããŸãã

ååã¯ãButtonBackgroundãããã¹ã¯æ°ããäœæããããQMLããã©ã«ããŒãžã®ãã¹ã§ãã

ãã¬ãã£ãã¯ã¹ã確èªããŸããããŒãžã§ã³ç®¡çã¯å¿ èŠãªãããã[å®äº]ãã¯ãªãã¯ããŸãã

åæ§ã«ããButtonLabel.qmlããã¡ã€ã«ãäœæããŸãã ãããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸããã

ãQML / ButtonBackground.qmlããããã«ã¯ãªãã¯ããŠéããŸãã 次ã®ããã«ç·šéããŸãã
import QtQuick 2.2 Rectangle { anchors.fill: parent anchors.margins: 4 border.width: 2 border.color: "#FFFFFF" radius: height / 4 gradient: Gradient { GradientStop { position: 0; color: control.pressed ? "#00AAAA" : "#AAFFFF" } GradientStop { position: 1; color: "#00CCCC" } } // color: "#00AAAA" // opacity: 0.25 }
é çªã«ïŒ
-anchors.fillïŒparent-ãã¿ã³ã®èæ¯ãå®å šã«å¡ãã€ã¶ãããããã«ããparent-çŸåšã®èŠçŽ ãé 眮ãããŠãã芪èŠçŽ ãžã®ã¢ã¯ã»ã¹ã
-anchors.marginsïŒ4-ãã¹ãŠã®åŽé¢ããå°ããªã€ã³ãã³ããèšå®ããŸãã
-ããŒããŒ-ã¹ãããŒã¯èšå®[åç § ãµããªã¡ã³ã8] ;
-ååŸïŒé«ã/ 4-ããã§ã¯ãã§ã«èå³æ·±ãã§ãã ãã®å Žåãè§ãäžžãããããã«äœ¿çšãããŸãïŒå€ã¯ãã¿ã³ã®é«ãã«å¯ŸããŠåºãããŸãïŒããRectangleã®å¹ ãšé«ããåãã«èšå®ãããšãååã«å€§ããååŸå€ã䜿çšããŠRectangleããåãååŸã§ããŸãã
-åŸé ã¯2ç¹ã§æ§æãããŸãã æåã®ãã€ã³ãïŒãŒãäœçœ®ïŒã«æ³šæããŠãã ãã-ããã§ã¯ããã¿ã³ã®ç¶æ ïŒcontrol.pressedïŒã«åãæ¿ããŠãæŒããããã¿ã³ã«å¿ããŠè²ã決å®ããŸããåçŽãªæ¡ä»¶æŒç®åã䜿çšããŸãã çå®ã®å Žåã®ã¢ã¯ã·ã§ã³ïŒfalseã®å Žåã®ã¢ã¯ã·ã§ã³ã
-ã°ã©ããŒã·ã§ã³ã®ä»£ããã«è²ãèšå®ã§ããŸããããšãã°ãéæ床ïŒäžéæ床ïŒ0ã1ïŒã䜿çšããããšãã§ããŸãã
ãButtonBackground.qmlããä¿åãããmain.qmlãã«æ»ããŸãã äœæããQMLãã©ã«ããŒãã€ã³ããŒãã«è¿œå ããŸãã
import "QMLs"
ããã§ããã®ãã©ã«ããŒå ã®ãã¹ãŠã®QMLãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããŸãã ãã¿ã³ã¹ã¿ã€ã«ã«æ»ããäœæããã°ããã®èæ¯ãæå®ããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸãã
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} } } }
ãã¹ãŠãä¿åããŠå®è¡ããŸãã

ãã¿ã³ã¯å°ãæãããªããŸãããã眲åããããŸããã ä¿®æ£ããŠãã ããã ãButtonLabel.qmlããéãã次ã®ããã«ç·šéããŸãã
import QtQuick 2.2 Text { anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.bold: true font.pixelSize: (mainWindow.width>mainWindow.height) ? parent.height/1.75 : parent.height / 2.5 color: "#005050" // text: "" }
眲åã¯ãã¿ã³æ¬äœãå®å šã«åããäžå€®ã«é 眮ããã倧èãªé¡ãããŠããŸãã 眲åã®ãµã€ãºã¯ãçŸåšã®ç»é¢ã®åããåºæºã«ããŠèšç®ãããŸããå¹ ã倧ããã»ã©æšªåãã«ãªããé«ã-瞊åãã«ãªãã®ã¯è«ççã§ã[åç § è£è¶³2] ã ããã§ã¯ãã¿ã³ããã¹ããã€ã³ã¹ããŒã«ããŸãããããã¯äžäŸ¿ã§ãã
åã³ãmain.qmlããéããŸãã äœæããã°ããã®ãButtonLabelããã©ãã«ã¹ã¿ã€ã«ã«è¿œå ããŸããããã§ã¯ããã¿ã³ããã¹ããããã«ç€ºããŸã[åç § ãµããªã¡ã³ã3] ã 次ã®ããã«ãªããŸãã
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } } }
ãã¹ãŠãä¿åããŠå®è¡ããŸãã

ã¯ãªãã¯å¯èœãªãã¿ã³ãããã®ã§ãã¯ãªãã¯ãã³ãã©ãŒãè¿œå ããŠããã°ã«ã¡ãã»ãŒãžãåºåããŸãã ãããè¡ãã«ã¯ããã¿ã³å ã«è¡ãè¿œå ããŸãã
onClicked: console.log("Button '' clicked")
åèšã§ïŒ
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: console.log("Button '' clicked") } }
å®è¡ããŠç¢ºèªããŠãã ããã ãã¢ããªã±ãŒã·ã§ã³åºåãããã«ïŒQt CreatorãŠã£ã³ããŠã®äžçªäžïŒã®ãã¿ã³ãã¯ãªãã¯ãããšãæ°ããè¡ã衚瀺ãããŸãïŒãqmlïŒButton 'Test' clickedãïŒ

ããã§ãä»ã®ãšãããã¿ã³ã§äœæ¥ãçµäºããŸãã
3.2.2ã ããã¹ãå
¥åãã£ãŒã«ããäœæãã
ãmain.qmlããéããŸãã ããã¿ã³ãã®äžã«è¿œå ïŒ
ãµã€ãºãèšå®ããŸãããã£ãŒã«ãããããã¹ããèªã¿åãã«ã¯idãå¿ èŠã§ãã äžå€®ã«é 眮ãé 眮ãããã¬ãŒã¹ãã«ããŒãæå®ããŸãã
ãŸãããã®å ¥åã«åçŽãªæ£èŠè¡šçŸãè¿œå ããŸãïŒãããã®å Žåããaããããiããããã³ãaããããzãã®æåãåèš16æå以å ïŒã
ã¹ã¿ã€ã«ã¯å¥ã®ãã¡ã€ã«ã«ç§»åãããŸããã èæ¯ïŒèæ¯ïŒã«çœãé·æ¹åœ¢ã眮ããå ¥åããã¹ããšãã¬ãŒã¹ãã«ããŒã®è²ãèšå®ããŸãã ãã©ã³ãã§ã¯ãåèªã倧æåïŒfont.capitalization = Font.CapitalizeïŒã倪åãããã³ãã©ã³ããµã€ãºã§æ§æããŸãïŒããã§ã¯èŠªèŠçŽ ã«ã¢ã¯ã»ã¹ã§ããªããããç»é¢ã®é«ãã«å¯Ÿãããµã€ãºãèšç®ããŸãïŒã
ãTextFieldãã®å ŽåãinputMethodHintsïŒãã£ãŒã«ãã«å€ãè¿œå ããããšãã§ããŸãïŒQt.ImhPreferNumbersãªã©ïŒã å€ã«å¿ããŠãå ¥åçšã®ããŸããŸãªããŒããŒãã衚瀺ãããŸãïŒQt.ImhPreferNumbersã®å Žåãæ°åãå ¥åããããã®ããŒããŒãã衚瀺ãããŸã[ä»é²6ãåç §] ïŒã ãã®å Žåããã®ãã£ãŒã«ãã¯è¿œå ããŸããã ãŸããechoModeãªã©ã®ä»ã®äŸ¿å©ãªãã©ã¡ãŒã¿ãŒããããŸãïŒãã¹ã¯ãŒããå ¥åããã«ã¯ãTextInput.Passwordã«èšå®ã§ããŸãïŒã
å¥ã«ãKeys.onPressedå ã®åŒã«ã€ããŠèšåããå¿ èŠããããŸãã ããã§ã¯ãå®äºãã¿ã³ã®ã¯ãªãã¯ã远跡ããŠãã¯ãªãã¯ãããšãã«Androidããã€ã¹ã®ããŒããŒããéããããã«ããŸãã ãããã£ãŠããmain.qmlãã¯æçµçã«æ¬¡ã®ããã«ãªããŸãã
Androidã¿ãã¬ãããšiPhoneã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãçŸåšã®ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
è«ççãªçµè«ãéæããããã«ããã¿ã³ãã¯ãªãã¯ããããšãã«ç§ãã¡ã®ååã®æšæ¶ã衚瀺ããã眲åãè¿œå ããŸãããã ãmain.qmlãã®ãTextFieldãã®åŸã«è¿œå ããŸãã
眲åã¯ãããã¹ãå ¥åãã£ãŒã«ãïŒyïŒtextField.heightïŒã®ããäžã«é 眮ãããŸãããã®ãããã¯ãŒãã©ãããèšå®ããŸãã ç¹°ãè¿ããŸããã䟿å®äžãããã¹ããå šäœãå¥ã®QMLãã¡ã€ã«ã«ç§»åã§ããŸããããã®å Žåã¯ãããè¡ããŸããã
ãã¿ã³ãæŒãããã®ããžãã¯ãèŠå®ããããšã¯æ®ã£ãŠããŸãã ãã¿ã³ã®onClickedãã£ãŒã«ãã«ç®çã®ã¢ã¯ã·ã§ã³ããã¹ãŠèšè¿°ã§ããŸãããä»åã¯ãã®ããã®é¢æ°ãäœæããŸãããã ããã¯ããã¿ã³ã«è¿œå ãããé¢æ°ã䜿çšããå Žåã®ãmain.qmlãã®å€èŠ³ã§ãã
ã芧ã®ãšãããããã¹ãããã©ãŒãããããããšãã§ããŸãïŒãã®å Žåã¯ã¿ã°ã䜿çšïŒãä¿åãå®è¡ãããã³ç¢ºèªããŸãã
TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { Qt.inputMethod.hide() event.accepted = true } } }
ãµã€ãºãèšå®ããŸãããã£ãŒã«ãããããã¹ããèªã¿åãã«ã¯idãå¿ èŠã§ãã äžå€®ã«é 眮ãé 眮ãããã¬ãŒã¹ãã«ããŒãæå®ããŸãã
ãŸãããã®å ¥åã«åçŽãªæ£èŠè¡šçŸãè¿œå ããŸãïŒãããã®å Žåããaããããiããããã³ãaããããzãã®æåãåèš16æå以å ïŒã
ã¹ã¿ã€ã«ã¯å¥ã®ãã¡ã€ã«ã«ç§»åãããŸããã èæ¯ïŒèæ¯ïŒã«çœãé·æ¹åœ¢ã眮ããå ¥åããã¹ããšãã¬ãŒã¹ãã«ããŒã®è²ãèšå®ããŸãã ãã©ã³ãã§ã¯ãåèªã倧æåïŒfont.capitalization = Font.CapitalizeïŒã倪åãããã³ãã©ã³ããµã€ãºã§æ§æããŸãïŒããã§ã¯èŠªèŠçŽ ã«ã¢ã¯ã»ã¹ã§ããªããããç»é¢ã®é«ãã«å¯Ÿãããµã€ãºãèšç®ããŸãïŒã
ãTextFieldãã®å ŽåãinputMethodHintsïŒãã£ãŒã«ãã«å€ãè¿œå ããããšãã§ããŸãïŒQt.ImhPreferNumbersãªã©ïŒã å€ã«å¿ããŠãå ¥åçšã®ããŸããŸãªããŒããŒãã衚瀺ãããŸãïŒQt.ImhPreferNumbersã®å Žåãæ°åãå ¥åããããã®ããŒããŒãã衚瀺ãããŸã[ä»é²6ãåç §] ïŒã ãã®å Žåããã®ãã£ãŒã«ãã¯è¿œå ããŸããã ãŸããechoModeãªã©ã®ä»ã®äŸ¿å©ãªãã©ã¡ãŒã¿ãŒããããŸãïŒãã¹ã¯ãŒããå ¥åããã«ã¯ãTextInput.Passwordã«èšå®ã§ããŸãïŒã
å¥ã«ãKeys.onPressedå ã®åŒã«ã€ããŠèšåããå¿ èŠããããŸãã ããã§ã¯ãå®äºãã¿ã³ã®ã¯ãªãã¯ã远跡ããŠãã¯ãªãã¯ãããšãã«Androidããã€ã¹ã®ããŒããŒããéããããã«ããŸãã ãããã£ãŠããmain.qmlãã¯æçµçã«æ¬¡ã®ããã«ãªããŸãã
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: console.log("Button '' clicked") } TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { Qt.inputMethod.hide() event.accepted = true } } } }
Androidã¿ãã¬ãããšiPhoneã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãçŸåšã®ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã


è«ççãªçµè«ãéæããããã«ããã¿ã³ãã¯ãªãã¯ããããšãã«ç§ãã¡ã®ååã®æšæ¶ã衚瀺ããã眲åãè¿œå ããŸãããã ãmain.qmlãã®ãTextFieldãã®åŸã«è¿œå ããŸãã
Text { id: text y: textField.height width: parent.width height: parent.height / 10 font.pixelSize: height / 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap }
眲åã¯ãããã¹ãå ¥åãã£ãŒã«ãïŒyïŒtextField.heightïŒã®ããäžã«é 眮ãããŸãããã®ãããã¯ãŒãã©ãããèšå®ããŸãã ç¹°ãè¿ããŸããã䟿å®äžãããã¹ããå šäœãå¥ã®QMLãã¡ã€ã«ã«ç§»åã§ããŸããããã®å Žåã¯ãããè¡ããŸããã
ãã¿ã³ãæŒãããã®ããžãã¯ãèŠå®ããããšã¯æ®ã£ãŠããŸãã ãã¿ã³ã®onClickedãã£ãŒã«ãã«ç®çã®ã¢ã¯ã·ã§ã³ããã¹ãŠèšè¿°ã§ããŸãããä»åã¯ãã®ããã®é¢æ°ãäœæããŸãããã ããã¯ããã¿ã³ã«è¿œå ãããé¢æ°ã䜿çšããå Žåã®ãmain.qmlãã®å€èŠ³ã§ãã
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { function hello() { if (textField.text != "") { text.text = ", <b>" + textField.text.toUpperCase() + "</b>!" } } width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: hello() } TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { Qt.inputMethod.hide() event.accepted = true } } } Text { id: text y: textField.height width: parent.width height: parent.height / 10 font.pixelSize: height / 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap } }
ã芧ã®ãšãããããã¹ãããã©ãŒãããããããšãã§ããŸãïŒãã®å Žåã¯ã¿ã°ã䜿çšïŒãä¿åãå®è¡ãããã³ç¢ºèªããŸãã

3.2.3ã ListViewã§ã®äœæ¥
ãã®äŸã§ã¯ã2ã€ã®ãªã¹ããäžåºŠã«äœæããŠãListViewã®æ©èœãããã«è¡šç€ºããŸãã ãããã¹ããã®äžã®ãmain.qmlãã«è¿œå ããŸãã
ListViewã®èå¥åãšãµã€ãºãèšå®ããŸãã ListViewèªäœã¯éæãªã®ã§ããã®ããã®åºç€ãäœæããŸããã
ã¯ãªãããã©ã¡ãŒã¿ã¯trueã«èšå®ãããŠããŸããããã¯ã ãã以å€ã®å Žåããªã¹ããã¹ã¯ããŒã«ãããšããªã¹ãã«è¡šç€ºãããããã«ãªãèŠçŽ ãListViewããã¯ããŒã«ãããŸãã
ééãã©ã¡ãŒã¿ãŒã¯ããªã¹ãé ç®éã®ã€ã³ãã³ããèšå®ããŸãã
ããã«ãã¢ãã«ã¯åºæ¬çã«ããŒã¿ã¢ãã«ã§ãã è€æ°ã®ListElementãå«ãListModelãå ¥åãããŸãã ãListElementãã¯å®éã«ã¯ãªã¹ãã®èŠçŽ ã§ãããå éšã«ç®çã®ååãšå€ã®ãã¢ãç»é²ã§ããŸãããã®å Žåããã¢ã¯1ã€ã ãã§ãã
ããªã²ãŒããã©ã¡ãŒã¿ãŒã¯ããªã¹ãå ã®åã¢ã€ãã ã®å€èŠ³ã決å®ããŸãã ããã¹ããå ¥ã£ãé·æ¹åœ¢ãã§ããŸãã ããã¹ããã©ã¡ãŒã¿ãŒã®å€ã«ã€ããŠã¯ãã¢ãã«ã«ä»¥åã«ç»é²ãããååãã©ã¡ãŒã¿ãŒã瀺ããŸãã
ãMouseAreaãã¯ãããŠã¹ã¯ãªãã¯ã远跡ããããç»é¢ã«è§Šãããã§ããé åã§ãã ããªã²ãŒãã®ãµã€ãºãå ¥åããŸãã ãæŒããšããã°ã«èŠçŽ ã®ã€ã³ããã¯ã¹ã衚瀺ãããŸãã MouseAreaã«ã¯äŸ¿å©ãªonPressedãã£ãŒã«ãããããŸãã
ãããŠonReleasedã
äžè¬ã«ãQMLã§èŠå®ãããŠããã¢ãã«ã¯å°æ¥å¿ èŠãããŸããã ããã¯ãšã³ããå å¡«ãè¡ããŸãã ãã ãããã®ãããªã¹ã¿ããäœæããŠãªã¹ãã®å€èŠ³ãã«ã¹ã¿ãã€ãºãããšäŸ¿å©ã§ãã ãŸããããªã²ãŒãã®ãã¶ã€ã³ãå¥ã®QMLãã¡ã€ã«ã§äœæããããšã䟿å©ã§ãã ãŸããListViewã«ã¯ããŸããŸãªãã©ã¡ãŒã¿ãŒãããã埮調æŽãè©Šã¿ãããšãã§ããããšãè¿œå ããŸãã ããããããã§ã¯ä»ã«äœãè€éã«ããŸããã äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããã ä¿åããŠå®è¡ïŒ
ãªã¹ãé ç®ãã¯ãªãã¯ããŠãã°ã確èªããŠã¿ãŸãããããqmlïŒListView elïŒ0 clickedïŒãã®ãããªè¡ã衚瀺ãããŸãã
2çªç®ã®ãªã¹ãã«ç§»åããŸãã æåã®ãªã¹ãã®äžã«è¿œå ããŸãã
ã¢ãã«ãšããŠããªã¯ãšã¹ãã«å¿ããŠè¿ãããç»åããããããããã«ãªã³ã¯ã䜿çšããŸãã ããªã²ãŒãã¯ã€ã¡ãŒãžèªäœã§ããããã®ãœãŒã¹ïŒãœãŒã¹ïŒã¯ã¢ãã«ã§æå®ããããªã³ã¯ã«ãªããŸãã ããŒã«ã«ãã¡ã€ã«ããœãŒã¹ãšããŠæå®ããããšãã§ããŸãã ãããè¡ãã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
-ãããžã§ã¯ããã©ã«ããŒã«ç»åãè¿œå ããŸãã
-Qt Creatorã®ãããžã§ã¯ãããªãŒã§ããqml.qrcããå³ã¯ãªãã¯ããããšãã£ã¿ãŒã§éãããéžæããŸãã
-ãŠã£ã³ããŠã®ãè¿œå ã->ããã¡ã€ã«ã®è¿œå ã->è¿œå ããç»åãéžæããŸãã
-QMLãã¡ã€ã«ã®ãã€ã¡ãŒãžãã§ããœãŒã¹ãšããŠã€ã¡ãŒãžãžã®ãã¹ã次ã®ããã«ç€ºããŸãïŒãqrcïŒ/ full_file_nameãã
ãç»åãã®å Žåã瞊暪æ¯ãç¶æããªããç»åèªäœãç®çã®å¹ /é«ãã®å¯žæ³ã«èª¿æŽãããããã«ãfillModeãèšå®ããŸãã
æ¹åãã©ã¡ãŒã¿ãŒïŒæ°Žå¹³æ¹åã«èšå®ïŒãšsnapModeïŒListView.SnapOneItemãäžç·ã«äœ¿çšãããšãListViewãAndroidã®ViewPagerã®ããã«ãªããšããå¹æãå®çŸã§ããŸãã
ã»ãŒå®äºã ãããžã§ã¯ãããªãŒã§ããã¡ã€ã«ãSample.proããéããããããã¯ãŒã¯ãããQT + = qml quick widgetsãè¡ã«è¿œå ããŸããããããªããšããããã¯ãŒã¯æ¥ç¶ãæ©èœããŸããã
念ã®ããããã¹ãŠã®ãmain.qmlãã³ãŒãã®ãªã¹ããæçš¿ããŠããŸãã
å®è¡ããŠäœãèµ·ãã£ããã確èªã§ããŸãã
ç§ã®æèŠã§ã¯ãQMLã§ListViewãæäœããã®ã¯éåžžã«ç°¡åã§äŸ¿å©ã§ãããã«ã¹ã¿ãã€ãºã®å¯èœæ§ã¯ãããããããŸãã ListViewã䜿çšãããšãããšãã°ãã¹ãããŒïŒãããã¢ãããªã¹ãïŒãå®è£ ããŠããªã¹ãã®å¯èŠæ§ïŒãã£ãŒã«ãã®è¡šç€ºïŒãæäœããããšãã§ããŸãã
éèŠãªæ³šæïŒäœããã®çç±ã§ãHabr㯠"map_url"ã®Â¢erãã»ã³ãèšå·ã«çœ®ãæããŸãã ãªã¯ãšã¹ããªã³ã¯ã§ã¯ãïŒcenter = ...ãã¹ããŒã¹ãªãã§ã®ã¿äœ¿çšããå¿ èŠããããŸãã
ListView { id: lvList objectName: "lvList" y: text.y + text.height width: parent.width height: parent.height * 0.3 clip: true spacing: 8 model: ListModel { ListElement { name: " 0" } ListElement { name: " 1" } ListElement { name: " 2" } } delegate: Rectangle { width: lvList.width height: lvList.height / 3 color: "#00AAAA" Text { text: name } MouseArea { anchors.fill: parent onClicked: console.log("ListView el#" + index + " clicked!") } } }
ListViewã®èå¥åãšãµã€ãºãèšå®ããŸãã ListViewèªäœã¯éæãªã®ã§ããã®ããã®åºç€ãäœæããŸããã
ã¯ãªãããã©ã¡ãŒã¿ã¯trueã«èšå®ãããŠããŸããããã¯ã ãã以å€ã®å Žåããªã¹ããã¹ã¯ããŒã«ãããšããªã¹ãã«è¡šç€ºãããããã«ãªãèŠçŽ ãListViewããã¯ããŒã«ãããŸãã
ééãã©ã¡ãŒã¿ãŒã¯ããªã¹ãé ç®éã®ã€ã³ãã³ããèšå®ããŸãã
ããã«ãã¢ãã«ã¯åºæ¬çã«ããŒã¿ã¢ãã«ã§ãã è€æ°ã®ListElementãå«ãListModelãå ¥åãããŸãã ãListElementãã¯å®éã«ã¯ãªã¹ãã®èŠçŽ ã§ãããå éšã«ç®çã®ååãšå€ã®ãã¢ãç»é²ã§ããŸãããã®å Žåããã¢ã¯1ã€ã ãã§ãã
ããªã²ãŒããã©ã¡ãŒã¿ãŒã¯ããªã¹ãå ã®åã¢ã€ãã ã®å€èŠ³ã決å®ããŸãã ããã¹ããå ¥ã£ãé·æ¹åœ¢ãã§ããŸãã ããã¹ããã©ã¡ãŒã¿ãŒã®å€ã«ã€ããŠã¯ãã¢ãã«ã«ä»¥åã«ç»é²ãããååãã©ã¡ãŒã¿ãŒã瀺ããŸãã
ãMouseAreaãã¯ãããŠã¹ã¯ãªãã¯ã远跡ããããç»é¢ã«è§Šãããã§ããé åã§ãã ããªã²ãŒãã®ãµã€ãºãå ¥åããŸãã ãæŒããšããã°ã«èŠçŽ ã®ã€ã³ããã¯ã¹ã衚瀺ãããŸãã MouseAreaã«ã¯äŸ¿å©ãªonPressedãã£ãŒã«ãããããŸãã
ãããŠonReleasedã
äžè¬ã«ãQMLã§èŠå®ãããŠããã¢ãã«ã¯å°æ¥å¿ èŠãããŸããã ããã¯ãšã³ããå å¡«ãè¡ããŸãã ãã ãããã®ãããªã¹ã¿ããäœæããŠãªã¹ãã®å€èŠ³ãã«ã¹ã¿ãã€ãºãããšäŸ¿å©ã§ãã ãŸããããªã²ãŒãã®ãã¶ã€ã³ãå¥ã®QMLãã¡ã€ã«ã§äœæããããšã䟿å©ã§ãã ãŸããListViewã«ã¯ããŸããŸãªãã©ã¡ãŒã¿ãŒãããã埮調æŽãè©Šã¿ãããšãã§ããããšãè¿œå ããŸãã ããããããã§ã¯ä»ã«äœãè€éã«ããŸããã äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããã ä¿åããŠå®è¡ïŒ

ãªã¹ãé ç®ãã¯ãªãã¯ããŠãã°ã確èªããŠã¿ãŸãããããqmlïŒListView elïŒ0 clickedïŒãã®ãããªè¡ã衚瀺ãããŸãã
2çªç®ã®ãªã¹ãã«ç§»åããŸãã æåã®ãªã¹ãã®äžã«è¿œå ããŸãã
ListView { id: lvPager y: lvList.y + lvList.height width: parent.width height: parent.height * 0.2 clip: true model: ListModel { ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Moscow" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=London" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Rio" } } delegate: Image { width: lvPager.width height: lvPager.height source: map_url fillMode: Image.PreserveAspectFit } orientation: ListView.Horizontal snapMode: ListView.SnapOneItem }
ã¢ãã«ãšããŠããªã¯ãšã¹ãã«å¿ããŠè¿ãããç»åããããããããã«ãªã³ã¯ã䜿çšããŸãã ããªã²ãŒãã¯ã€ã¡ãŒãžèªäœã§ããããã®ãœãŒã¹ïŒãœãŒã¹ïŒã¯ã¢ãã«ã§æå®ããããªã³ã¯ã«ãªããŸãã ããŒã«ã«ãã¡ã€ã«ããœãŒã¹ãšããŠæå®ããããšãã§ããŸãã ãããè¡ãã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
-ãããžã§ã¯ããã©ã«ããŒã«ç»åãè¿œå ããŸãã
-Qt Creatorã®ãããžã§ã¯ãããªãŒã§ããqml.qrcããå³ã¯ãªãã¯ããããšãã£ã¿ãŒã§éãããéžæããŸãã
-ãŠã£ã³ããŠã®ãè¿œå ã->ããã¡ã€ã«ã®è¿œå ã->è¿œå ããç»åãéžæããŸãã
-QMLãã¡ã€ã«ã®ãã€ã¡ãŒãžãã§ããœãŒã¹ãšããŠã€ã¡ãŒãžãžã®ãã¹ã次ã®ããã«ç€ºããŸãïŒãqrcïŒ/ full_file_nameãã
ãç»åãã®å Žåã瞊暪æ¯ãç¶æããªããç»åèªäœãç®çã®å¹ /é«ãã®å¯žæ³ã«èª¿æŽãããããã«ãfillModeãèšå®ããŸãã
æ¹åãã©ã¡ãŒã¿ãŒïŒæ°Žå¹³æ¹åã«èšå®ïŒãšsnapModeïŒListView.SnapOneItemãäžç·ã«äœ¿çšãããšãListViewãAndroidã®ViewPagerã®ããã«ãªããšããå¹æãå®çŸã§ããŸãã
ã»ãŒå®äºã ãããžã§ã¯ãããªãŒã§ããã¡ã€ã«ãSample.proããéããããããã¯ãŒã¯ãããQT + = qml quick widgetsãè¡ã«è¿œå ããŸããããããªããšããããã¯ãŒã¯æ¥ç¶ãæ©èœããŸããã

念ã®ããããã¹ãŠã®ãmain.qmlãã³ãŒãã®ãªã¹ããæçš¿ããŠããŸãã
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { function hello() { if (textField.text != "") { text.text = ", <b>" + textField.text.toUpperCase() + "</b>!" } } width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: hello() } TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { Qt.inputMethod.hide() event.accepted = true } } } Text { id: text y: textField.height width: parent.width height: parent.height / 10 font.pixelSize: height / 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap } ListView { id: lvList objectName: "lvList" y: text.y + text.height width: parent.width height: parent.height * 0.3 clip: true spacing: 8 model: ListModel { ListElement { name: " 0" } ListElement { name: " 1" } ListElement { name: " 2" } } delegate: Rectangle { width: lvList.width height: lvList.height / 3 color: "#00AAAA" Text { text: name } MouseArea { anchors.fill: parent onClicked: console.log("ListView el#" + index + " clicked!") } } } ListView { id: lvPager y: lvList.y + lvList.height width: parent.width height: parent.height * 0.2 clip: true model: ListModel { ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Moscow" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=London" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Rio" } } delegate: Image { width: lvPager.width height: lvPager.height source: map_url fillMode: Image.PreserveAspectFit } orientation: ListView.Horizontal snapMode: ListView.SnapOneItem } }
å®è¡ããŠäœãèµ·ãã£ããã確èªã§ããŸãã

ç§ã®æèŠã§ã¯ãQMLã§ListViewãæäœããã®ã¯éåžžã«ç°¡åã§äŸ¿å©ã§ãããã«ã¹ã¿ãã€ãºã®å¯èœæ§ã¯ãããããããŸãã ListViewã䜿çšãããšãããšãã°ãã¹ãããŒïŒãããã¢ãããªã¹ãïŒãå®è£ ããŠããªã¹ãã®å¯èŠæ§ïŒãã£ãŒã«ãã®è¡šç€ºïŒãæäœããããšãã§ããŸãã
éèŠãªæ³šæïŒäœããã®çç±ã§ãHabr㯠"map_url"ã®Â¢erãã»ã³ãèšå·ã«çœ®ãæããŸãã ãªã¯ãšã¹ããªã³ã¯ã§ã¯ãïŒcenter = ...ãã¹ããŒã¹ãªãã§ã®ã¿äœ¿çšããå¿ èŠããããŸãã
3.2.4ã ããŒããŒãšããã€ãã®ã¢ãã¡ãŒã·ã§ã³ã䜿çšãã
ãããŒããŒãã¯ãQMLã§ãã«ããŠã£ã³ããŠãå®è£
ã§ããããã«ãããšã³ãã£ãã£ã§ãã äžæ žãšãªããããŒããŒãã¯ãQMLãã¡ã€ã«ããœãŒã¹ãšããŠæã€åãªãã³ã³ããã§ãïŒçè«çã«ã¯ããã®ãã¡ã€ã«ãå€éšãµãŒããŒã®ã©ããã«é
眮ããããšãã§ããŸãïŒã ããã§éåžžã«éèŠã§ããQMLãŸãã¯C ++ã³ãŒãããLoaderå
ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããå Žåããã®èŠçŽ ãå«ãã³ã³ãããçŸæç¹ã§Loaderã«ããŒãããå¿
èŠããããŸããããããªããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã çŸæç¹ã§ã¯ååšããªãèŠçŽ ãåç
§ããããšã¯ã§ãããQtã«ãã®ããããã£ã®äžéšãå€æŽããããã«äŸé Œããããšã¯ã§ããŸããã åé¡ã解決ããã«ã¯ãç¹å®ã®ã³ã³ããã®ã¢ã¯ãã£ããã£ã«é¢ããããŒã«å€ãã©ã°ãä¿åããããå±éºãªæéïŒããšãã°ããµãŒããŒãžã®æ¥ç¶ã®é²è¡äžïŒã«ããŒããŒã®ã³ã³ãã³ãã®åãæ¿ããçŠæ¢ããŸãïŒããã²ãŒã·ã§ã³ãã¿ã³ã§æå¹ïŒfalseãèšå®ã§ããŸãïŒã
ãããã£ãŠããããžã§ã¯ãã®QMLãã©ã«ããŒã«2ã€ã®QMLãã¡ã€ã«ãäœæããŸãã ãããããLoader1.qmlãããã³ãLoader2.qmlããšåŒã³ãŸãããã ãLoader1.qmlãïŒ
ãã ã®ç·è²ã®é·æ¹åœ¢ã ä»ãLoader2.qmlãïŒ
focusïŒtrueãæå®ããŠãã ããã ããã§ãªãå ŽåãKeys.onPressedã»ã¯ã·ã§ã³ã¯èµ·åããŸããã
SequentialAnimationã¯ãäžé£ã®ã¢ãã¡ãŒã·ã§ã³ã§ãã runningïŒtrueãã©ã¡ãŒã¿ãŒãæå®ããŠãã¢ãã¡ãŒã·ã§ã³ãããã«æ©èœããããã«ãã«ãŒãïŒç¹°ãè¿ãã®æ°ïŒãç¡éã«èšå®ããŸãã
å éšã§ã¯ãSequentialAnimationã«ã¯2ã€ã®PropertyAnimationsããããŸãã ç¹å®ã®æéïŒæéïŒã®éãã¿ãŒã²ããèŠçŽ ïŒã¿ãŒã²ããïŒã®ãã©ã¡ãŒã¿ãŒïŒããããã£ïŒãç®çã®å€ïŒã«ïŒã«å€æŽã§ããŸãã
ã¢ãã¡ãŒã·ã§ã³ãåæ¢ããåŸïŒrunningïŒfalseã«èšå®ããå ŽåïŒãå€æŽããããã¹ãŠã®ã¿ãŒã²ãããã©ã¡ãŒã¿ãå ã®ãã©ã¡ãŒã¿ã«æåã§æ»ãå¿ èŠãããããšã«æ³šæããŠãã ããã
ãmain.qmlãå ã«ããŒããŒèªäœãäœæããŸãã
å éšèŠçŽ ïŒãœãŒã¹ïŒããã¿ã³ã®ã¯ãªãã¯ãç£èŠããããã«ãå¿ ãfocusïŒtrueãæå®ããŠãã ããã
: . , Keys.onPressed :
«main.qml», :
«main.qml»:
url (& center) , . , :
«Loader» . Android- «Back», .
UI QML C++ .
ãããã£ãŠããããžã§ã¯ãã®QMLãã©ã«ããŒã«2ã€ã®QMLãã¡ã€ã«ãäœæããŸãã ãããããLoader1.qmlãããã³ãLoader2.qmlããšåŒã³ãŸãããã ãLoader1.qmlãïŒ
import QtQuick 2.2 Rectangle { anchors.fill: parent color: "green" opacity: 0.2 }
ãã ã®ç·è²ã®é·æ¹åœ¢ã ä»ãLoader2.qmlãïŒ
import QtQuick 2.2 Rectangle { id: rect anchors.fill: parent focus: true color: "blue" opacity: 0.2 SequentialAnimation { running: true loops: SequentialAnimation.Infinite PropertyAnimation { target: rect; property: "opacity"; to: 0; duration: 500 } PropertyAnimation { target: rect; property: "opacity"; to: 0.2; duration: 500 } } Keys.onPressed: { if (event.key == Qt.Key_Back || event.key == Qt.Key_Escape) { loader.source = "qrc:/QMLs/Loader1.qml" event.accepted = true } } }
focusïŒtrueãæå®ããŠãã ããã ããã§ãªãå ŽåãKeys.onPressedã»ã¯ã·ã§ã³ã¯èµ·åããŸããã
SequentialAnimationã¯ãäžé£ã®ã¢ãã¡ãŒã·ã§ã³ã§ãã runningïŒtrueãã©ã¡ãŒã¿ãŒãæå®ããŠãã¢ãã¡ãŒã·ã§ã³ãããã«æ©èœããããã«ãã«ãŒãïŒç¹°ãè¿ãã®æ°ïŒãç¡éã«èšå®ããŸãã
å éšã§ã¯ãSequentialAnimationã«ã¯2ã€ã®PropertyAnimationsããããŸãã ç¹å®ã®æéïŒæéïŒã®éãã¿ãŒã²ããèŠçŽ ïŒã¿ãŒã²ããïŒã®ãã©ã¡ãŒã¿ãŒïŒããããã£ïŒãç®çã®å€ïŒã«ïŒã«å€æŽã§ããŸãã
ã¢ãã¡ãŒã·ã§ã³ãåæ¢ããåŸïŒrunningïŒfalseã«èšå®ããå ŽåïŒãå€æŽããããã¹ãŠã®ã¿ãŒã²ãããã©ã¡ãŒã¿ãå ã®ãã©ã¡ãŒã¿ã«æåã§æ»ãå¿ èŠãããããšã«æ³šæããŠãã ããã
ãmain.qmlãå ã«ããŒããŒèªäœãäœæããŸãã
Loader { id: loader y: lvPager.y + lvPager.height width: parent.width height: parent.height * 0.2 focus: true source: "qrc:/QMLs/Loader1.qml" }
å éšèŠçŽ ïŒãœãŒã¹ïŒããã¿ã³ã®ã¯ãªãã¯ãç£èŠããããã«ãå¿ ãfocusïŒtrueãæå®ããŠãã ããã
: . , Keys.onPressed :
Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return || event.key == Qt.Key_Back) { Qt.inputMethod.hide() loader.forceActiveFocus() event.accepted = true } }
«main.qml», :
Button { width: mainWindow.width / 4.5 height: mainWindow.height / 10 x: mainWindow.width / 2 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "Loader" } } onClicked: loader.setSource("qrc:/QMLs/Loader2.qml") }
«main.qml»:
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { function hello() { if (textField.text != "") { text.text = ", <b>" + textField.text.toUpperCase() + "</b>!" } } width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: hello() } TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return || event.key == Qt.Key_Back) { Qt.inputMethod.hide() loader.forceActiveFocus() event.accepted = true } } } Text { id: text y: textField.height width: parent.width height: parent.height / 10 font.pixelSize: height / 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap } ListView { id: lvList objectName: "lvList" y: text.y + text.height width: parent.width height: parent.height * 0.3 clip: true spacing: 8 model: ListModel { ListElement { name: " 0" } ListElement { name: " 1" } ListElement { name: " 2" } } delegate: Rectangle { width: lvList.width height: lvList.height / 3 color: "#00AAAA" Text { text: name } MouseArea { anchors.fill: parent onClicked: console.log("ListView el#" + index + " clicked!") } } } ListView { id: lvPager y: lvList.y + lvList.height width: parent.width height: parent.height * 0.2 clip: true model: ListModel { ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Moscow" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=London" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Rio" } } delegate: Image { width: lvPager.width height: lvPager.height source: map_url fillMode: Image.PreserveAspectFit } orientation: ListView.Horizontal snapMode: ListView.SnapOneItem } Loader { id: loader y: lvPager.y + lvPager.height width: parent.width height: parent.height * 0.2 focus: true source: "qrc:/QMLs/Loader1.qml" } Button { width: mainWindow.width / 4.5 height: mainWindow.height / 10 x: mainWindow.width / 2 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "Loader" } } onClicked: loader.setSource("qrc:/QMLs/Loader2.qml") } }
url (& center) , . , :


«Loader» . Android- «Back», .
UI QML C++ .
3.3.
, QML- C++ , QML C++ , GET/POST- JSON-.
-, // , .
«qt_api», «test.php». :
JSON, «test.php» (http://localhost/qt_api/test.php) .
C++ Qt Creator: «Sample» -> « âŠÂ» -> «C++» / « C++». «Backend», «QQuickItem» [. 4] , :
«», «». «backend.h». :
.
. ( explicit). , , . Qt . , ( , , ), , Qt .
makeRequest. QML-, Q_INVOKABLE. id ( ).
(private) . QQmlApplicationEngine QML-. QObject QML [. 5] . QNetworkAccessManager (- DefaultHttpClient Android). , QML.
. , -. / â Qt, , , . :
:
, ( connect()) . , , , - -. , namRequest. (slotRequestFinished(QNetworkReply*)) â - QNetworkAccessManager: , namRequest finished(QNetworkReply*), , (QNetworkReply).
«backend.cpp», :
, . : .
QML- QQmlApplicationEngine.
QML:
objectName, QML. lvList:
«backend» Backend. ( Q_INVOKABLE-) QML:
«color_example» QML:
namRequest:
finished(QNetworkReply*) slotRequestFinished(QNetworkReply*):
connect 4 :
â , ;
â ;
â , ( );
â , .
makeRequest. , :
QML ( ). QString:
GET- , :
int- ( makeRequest) QString. QString::number().
(QString QByteArray):
QNetworkRequest QNetworkAccessManager GET-:
POST- , . , POST-, , CodeIgniter', «Disallowed Characters Error», .
, , .
, , , :
, . QJsonDocument JSON-. QJsonDocument QJsonDocument::fromJson(reply->readAll()), : reply->readAll(). , QNetworkReply, , ( - ).
JSON- QJsonDocument:
QJsonValue «done» JSON-:
QJsonValue â JSON-, ( , , ..). QJsonValue . , QJsonValue JSON- QJsonValue ( «number») . , , QJsonValue double. «number» (3 ).
«boolean» «done» .
JSON- Qt: JSON- , ( Android, , JSONException). (, ), .
, Qt «» JSON-, , , JSON' .
QML JSON-, .
JSON- «list» QJsonArray:
«clear» «lvList» ( «clear» ListView QML- ):
«lvList» JSON- â -, , «name» (, ListView?):
«append» «lvList» ( ):
QMetaObject::invokeMethod() :
â â , ;
â â , «lvList»;
â â , «append», «map».
:
:
. «main.cpp»:
«Backend», .
«clear», «append» ListView («lvList») «main.qml»:
C++ «append» ( ), .
:
, makeRequest() Backend:
«btnRequest», , C++ ,
â - QML-: «property», , . : id_._.
. -, :
, «color_example» «Backend»? -, :
, , , ( property «_id», ).
«main.qml»:
, . «Request» ( iPhone ) :
:
localhost/qt_api/test?id=3
123.000
json true
ããã§ãã :). (https://www.dropbox.com/s/to9kk0l71d6ma4h/Sample.zip).
, Qt:
, . , â Android . â , ApplicationWindow [. 7] . â «Backend» QML :
QML- «ApplicationWindow» :
:). , . Android ( , , Qt, , ), . «» -> «Android» -> «».
-, // , .
«qt_api», «test.php». :
<? echo json_encode(json_decode( '{ "done" : { "boolean" : true, "number" : 123, "list" : [ "field1", "field2", "field3", "field4", "field5" ] } }' )); ?>
JSON, «test.php» (http://localhost/qt_api/test.php) .
C++ Qt Creator: «Sample» -> « âŠÂ» -> «C++» / « C++». «Backend», «QQuickItem» [. 4] , :

«», «». «backend.h». :
#ifndef BACKEND_H #define BACKEND_H #include <QQmlApplicationEngine> #include <QQuickItem> #include <QtQuick> #include <QNetworkAccessManager> class Backend : public QQuickItem { Q_OBJECT public: explicit Backend(QQuickItem *parent = 0); Q_INVOKABLE void makeRequest(int id); private: QQmlApplicationEngine engine; QObject * mainWindow; QObject * lvList; QObject * btnRequest; QNetworkAccessManager * namRequest; static const QString color_example; signals: private slots: void slotRequestFinished(QNetworkReply*); }; #endif // BACKEND_H
.
. ( explicit). , , . Qt . , ( , , ), , Qt .
makeRequest. QML-, Q_INVOKABLE. id ( ).
(private) . QQmlApplicationEngine QML-. QObject QML [. 5] . QNetworkAccessManager (- DefaultHttpClient Android). , QML.
. , -. / â Qt, , , . :
void mySignal();
:
emit mySignal();
, ( connect()) . , , , - -. , namRequest. (slotRequestFinished(QNetworkReply*)) â - QNetworkAccessManager: , namRequest finished(QNetworkReply*), , (QNetworkReply).
«backend.cpp», :
#include "backend.h" const QString Backend::color_example = "#000000"; Backend::Backend(QQuickItem *parent) : QQuickItem(parent) { engine.rootContext()->setContextProperty("color_example", color_example); engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); mainWindow = engine.rootObjects().value(0); lvList = mainWindow->findChild<QObject*>("lvList"); btnRequest = mainWindow->findChild<QObject*>("btnRequest"); engine.rootContext()->setContextProperty("backend", this); namRequest = new QNetworkAccessManager(this); connect(namRequest, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotRequestFinished(QNetworkReply*))); } void Backend::makeRequest(int id) { btnRequest->setProperty("enabled", "false"); // btnRequest->property("enabled"); QString prepareRequest("http://localhost/qt_api/test"); // HttpGet prepareRequest.append("?id="); prepareRequest.append(QString::number(id)); qDebug(prepareRequest.toUtf8()); QNetworkRequest request(QUrl(prepareRequest.toUtf8())); namRequest->get(request); // HttpPost /*QNetworkRequest request(QUrl(prepareRequest.toUtf8())); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QString params("id="); params.append(QString::number(id)); qDebug(params.toUtf8()); namRequest->post(request, QByteArray(params.toUtf8()));*/ } void Backend::slotRequestFinished(QNetworkReply * reply) { if (reply->error() != QNetworkReply::NoError) { qDebug(reply->errorString().toUtf8()); } else { QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll()); QJsonObject jsonObj; QJsonValue jsonVal; QJsonArray jsonArr; jsonObj = jsonDoc.object(); jsonVal = jsonObj.value("done"); if (!jsonVal.isNull() && jsonVal.isObject()) { jsonObj = jsonVal.toObject(); jsonVal = jsonObj.value("number"); if (!jsonVal.isNull() && jsonVal.isDouble()) { qDebug(QString::number(jsonVal.toDouble(), 'f', 3).toUtf8()); } } if (jsonDoc.object().value("done").toObject().value("boolean").toBool()) { qDebug("json true"); } else { qDebug("json false"); } jsonArr = jsonDoc.object().value("done").toObject().value("list").toArray(); QMetaObject::invokeMethod(lvList, "clear"); for (int i=0; i<jsonArr.size(); i++) { QVariantMap map; map.insert("name", jsonArr.at(i).toString()); QMetaObject::invokeMethod(lvList, "append", Q_ARG(QVariant, QVariant::fromValue(map))); } } btnRequest->setProperty("enabled", "true"); reply->deleteLater(); }
, . : .
QML- QQmlApplicationEngine.
QML:
mainWindow = engine.rootObjects().value(0);
objectName, QML. lvList:
lvList = mainWindow->findChild<QObject*>("lvList");
«backend» Backend. ( Q_INVOKABLE-) QML:
engine.rootContext()->setContextProperty("backend", this);
«color_example» QML:
engine.rootContext()->setContextProperty("color_example", color_example);
namRequest:
namRequest = new QNetworkAccessManager(this);
finished(QNetworkReply*) slotRequestFinished(QNetworkReply*):
connect(namRequest, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotRequestFinished(QNetworkReply*)));
connect 4 :
â , ;
â ;
â , ( );
â , .
makeRequest. , :
btnRequest->setProperty("enabled", "false");
QML ( ). QString:
QString prepareRequest(«http://localhost/qt_api/test");
GET- , :
prepareRequest.append("?id="); prepareRequest.append(QString::number(id));
int- ( makeRequest) QString. QString::number().
(QString QByteArray):
qDebug(prepareRequest.toUtf8());
QNetworkRequest QNetworkAccessManager GET-:
QNetworkRequest request(QUrl(prepareRequest.toUtf8())); namRequest->get(request);
POST- , . , POST-, , CodeIgniter', «Disallowed Characters Error», .
, , .
, , , :
if (reply->error() != QNetworkReply::NoError) { qDebug(reply->errorString().toUtf8()); }
, . QJsonDocument JSON-. QJsonDocument QJsonDocument::fromJson(reply->readAll()), : reply->readAll(). , QNetworkReply, , ( - ).
JSON- QJsonDocument:
jsonObj = jsonDoc.object();
QJsonValue «done» JSON-:
jsonVal = jsonObj.value("done");
QJsonValue â JSON-, ( , , ..). QJsonValue . , QJsonValue JSON- QJsonValue ( «number») . , , QJsonValue double. «number» (3 ).
«boolean» «done» .
JSON- Qt: JSON- , ( Android, , JSONException). (, ), .
, Qt «» JSON-, , , JSON' .
QML JSON-, .
JSON- «list» QJsonArray:
jsonArr = jsonDoc.object().value("done").toObject().value("list").toArray();
«clear» «lvList» ( «clear» ListView QML- ):
QMetaObject::invokeMethod(lvList, "clear");
«lvList» JSON- â -, , «name» (, ListView?):
QVariantMap map; map.insert("name", jsonArr.at(i).toString());
«append» «lvList» ( ):
QMetaObject::invokeMethod(lvList, "append", Q_ARG(QVariant, QVariant::fromValue(map)));
QMetaObject::invokeMethod() :
â â , ;
â â , «lvList»;
â â , «append», «map».
:
btnRequest->setProperty("enabled", «true");
:
reply->deleteLater();
. «main.cpp»:
#include <QApplication> #include "backend.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); new Backend(); return app.exec(); }
«Backend», .
«clear», «append» ListView («lvList») «main.qml»:
function clear() { lvList.model.clear() } function append(newElement) { lvList.model.append(newElement) }
C++ «append» ( ), .
:
model: ListModel { //ListElement { name: " 0" } //ListElement { name: " 1" } //ListElement { name: " 2" } }
, makeRequest() Backend:
Button { objectName: "btnRequest" property int _id: 3 width: mainWindow.width / 4.5 height: mainWindow.height / 10 x: mainWindow.width - width y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground { border.color: color_example } label: ButtonLabel { text: "Request" } } onClicked: backend.makeRequest(_id) }
«btnRequest», , C++ ,
property int _id: 3
â - QML-: «property», , . : id_._.
. -, :
background: ButtonBackground { border.color: color_example }
, «color_example» «Backend»? -, :
onClicked: backend.makeRequest(_id)
, , , ( property «_id», ).
«main.qml»:
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.2 import "QMLs" ApplicationWindow { id: mainWindow objectName: "mainWindow" visible: true width: 640 height: 480 color: "#F0F0FF" Button { function hello() { if (textField.text != "") { text.text = ", <b>" + textField.text.toUpperCase() + "</b>!" } } width: mainWindow.width / 2.5 height: mainWindow.height / 10 x: 0 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "" } } onClicked: hello() } TextField { id: textField width: parent.width height: parent.height / 10 horizontalAlignment: Text.AlignHCenter placeholderText: " " validator: RegExpValidator { regExp: /[--a-zA-Z]{16}/ } style: TextFieldStyle { background: Rectangle {color: "white"} textColor: "#00AAAA" placeholderTextColor: "#00EEEE" font: font.capitalization = Font.Capitalize, font.bold = true, font.pixelSize = mainWindow.height / 25 } Keys.onPressed: { if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return || event.key == Qt.Key_Back) { Qt.inputMethod.hide() loader.forceActiveFocus() event.accepted = true } } } Text { id: text y: textField.height width: parent.width height: parent.height / 10 font.pixelSize: height / 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode: Text.WordWrap } ListView { id: lvList objectName: "lvList" y: text.y + text.height width: parent.width height: parent.height * 0.3 clip: true spacing: 8 model: ListModel { //ListElement { name: " 0" } //ListElement { name: " 1" } //ListElement { name: " 2" } } delegate: Rectangle { width: lvList.width height: lvList.height / 3 color: "#00AAAA" Text { text: name } MouseArea { anchors.fill: parent onClicked: console.log("ListView el#" + index + " clicked!") } } function clear() { lvList.model.clear() } function append(newElement) { lvList.model.append(newElement) } } ListView { id: lvPager y: lvList.y + lvList.height width: parent.width height: parent.height * 0.2 clip: true model: ListModel { ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Moscow" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=London" } ListElement { map_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x320&scalse=2&sensor=false¢er=Rio" } } delegate: Image { width: lvPager.width height: lvPager.height source: map_url fillMode: Image.PreserveAspectFit } orientation: ListView.Horizontal snapMode: ListView.SnapOneItem } Loader { id: loader y: lvPager.y + lvPager.height width: parent.width height: parent.height * 0.2 focus: true source: "qrc:/QMLs/Loader1.qml" } Button { width: mainWindow.width / 4.5 height: mainWindow.height / 10 x: mainWindow.width / 2 y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground {} label: ButtonLabel { text: "Loader" } } onClicked: loader.setSource("qrc:/QMLs/Loader2.qml") } Button { objectName: "btnRequest" property int _id: 3 width: mainWindow.width / 4.5 height: mainWindow.height / 10 x: mainWindow.width - width y: mainWindow.height - height style: ButtonStyle { background: ButtonBackground { border.color: color_example } label: ButtonLabel { text: "Request" } } onClicked: backend.makeRequest(_id) } }
, . «Request» ( iPhone ) :

:
localhost/qt_api/test?id=3
123.000
json true
ããã§ãã :). (https://www.dropbox.com/s/to9kk0l71d6ma4h/Sample.zip).
, Qt:
// QSettings, , QSettings settings("settings.ini", QSettings::IniFormat); // , QString stringToSave; // , QDate QDate date = QDate::currentDate(); // stringToSave = date.toString("ddd-dd-MM-yyyy"); // id QUuid QUuid uniq_id = QUuid::createUuid(); // id stringToSave.append(" id="); stringToSave.append(uniq_id.toByteArray()); // settings.setValue("value1", stringToSave); settings.sync(); // qDebug(settings.value("value1").toString().toUtf8());
, . , â Android . â , ApplicationWindow [. 7] . â «Backend» QML :
engine.rootContext()->setContextProperty("screen_width", this->width()); engine.rootContext()->setContextProperty("screen_height", this->height());
QML- «ApplicationWindow» :
ApplicationWindow { . . . width: screen_width height: screen_height color: "#F0F0FF" . . .
:). , . Android ( , , Qt, , ), . «» -> «Android» -> «».
4.
, , . Qt, , . , , - . â .
, , , - , .
, , â Qt , QtWebEngine (, , WebView ), BLE â qt-project.org/wiki/New-Features-in-Qt-5.4 .
Qt , . , Qt .
, , !
, , , - , .
, , â Qt , QtWebEngine (, , WebView ), BLE â qt-project.org/wiki/New-Features-in-Qt-5.4 .
Qt , . , Qt .
, , !
1. UI , .. «anchors». , , :
2. , -, property, -, / UI-, .. Screen.primaryOrientation ( QtQuick.Window 2.0).
3. ( «text:»), . , .
4. C++ , QObject. QQuickItem .
5. C++ QML ( UI- ). :
â :
â - :
â QML «Connections» «ApplicationWindow», C++:
«target» â ContextProperty, , «onTestSignal:» â emit' «testSignal()».
6. «inputMethodHints» «Qt.ImhDialableCharactersOnly», .. «Qt.ImhPreferNumbers» .
7. UI «» Android QML ( ApplicationWindow) Screen.desktopAvailableWidth/Screen.desktopAvailableHeight ( QtQuick.Window 2.0).
8. :
anchors.bottom: some_element_id.top
2. , -, property, -, / UI-, .. Screen.primaryOrientation ( QtQuick.Window 2.0).
3. ( «text:»), . , .
4. C++ , QObject. QQuickItem .
5. C++ QML ( UI- ). :
â :
public: signals: void testSignal();
â - :
emit testSignal();
â QML «Connections» «ApplicationWindow», C++:
Connections{ target: backend; onTestSignal: console.log("emited!") }
«target» â ContextProperty, , «onTestSignal:» â emit' «testSignal()».
6. «inputMethodHints» «Qt.ImhDialableCharactersOnly», .. «Qt.ImhPreferNumbers» .
7. UI «» Android QML ( ApplicationWindow) Screen.desktopAvailableWidth/Screen.desktopAvailableHeight ( QtQuick.Window 2.0).
8. :
border { width: 2 color: "#FFFFFF" }