ãã®æçš¿ã¯ã
ãã® ïŒ
翻蚳ããã ïŒèšäºã®ç¶ãã§ãã
åã®æçš¿ã§ãQMLãšã³ãžã³ããã¡ã€ã«ãããŒãããæ¹æ³ãèŠãŠããŸããã æåã«QMLãã¡ã€ã«ãè§£æãããæ¬¡ã«äžéãã€ãã³ãŒãã«ã³ã³ãã€ã«ãããæåŸã«ãã€ãã³ãŒãåœä»€ã«åŸã£ãŠãåQMLãã¡ã€ã«ã®åã€ãã³ãã«å¯ŸããŠC ++ãªããžã§ã¯ããäœæãããããšãæãåºããŠãã ããã ããšãã°ãQMLãã¡ã€ã«ã«TextèŠçŽ ãå«ãŸããŠããå Žåããšã³ãžã³ã¯QQuickTextã¯ã©ã¹ã®C ++ã€ã³ã¹ã¿ã³ã¹ãäœæããããšãããããŸããã
å®éããã¡ã€ã«ã®ããŠã³ããŒãã¯QMLãšã³ãžã³ãè¡ãã»ãšãã©ãã¹ãŠã®ããšã§ãã ããŠã³ããŒãåŸãã¢ããªã±ãŒã·ã§ã³ããã»ã¹ãžã®å¹²æžã忢ããŸãã ã©ã³ã¿ã€ã ã®ã€ãã³ãåŠçããã³ã¬ã³ããªã³ã°èŠçŽ ã¯ãå®å
šã«C ++ã«äŸåããŸãã ããšãã°ãTextInputèŠçŽ ã¯æ¬¡ã®ãããªã€ãã³ããåŠçããŸã
QQuickTextInput :: keyPressEventïŒïŒããã³QQuickTextInput :: updatePaintNode ïŒïŒãæŽæ°ããŸããQMLãšã³ãžã³ã¯é¢äžããŸããã
ãã ããå®è¡æã«QMLãšã³ãžã³ã圱é¿ãäžãã2ã€ã®éèŠãªããšããããŸãã ãã€ã³ããããã·ã°ãã«ãã³ãã©ãŒãšããããã£ãã€ã³ãã£ã³ã°ã®æŽæ°ã§ãã é¢é£ããã·ã°ãã«ãã³ãã©ã¯ã MouseAreaã®onClickedãã³ãã©ã®ãããªãã®ã§ã ã 仿¥ã¯ãã€ã³ãã£ã³ã°ãèŠãŠãããŸãã
äŸïŒ
import QtQuick 2.0 Rectangle { width: 300 height: 300 color: "lightsteelblue" Text { anchors.centerIn: parent text: "Window Area: " + (parent.width * parent.height) } }
ãã®äŸã«ã¯ã2çš®é¡ã®ããããã£ã®å²ãåœãŠãå«ãŸããŠããŸãã
- C ++ã¯ã©ã¹QQuickRectangleã®RectangleèŠçŽ ã®widthããããã£ã«å€300ãå²ãåœãŠããªã©ã®åçŽãªããããã£å²ãåœãŠãã®å ŽåãVMEã¯ãã®ã³ã³ããŒãã³ããäœæãããšãã«STORE_DOUBLEãã€ãã³ãŒãåœä»€ãå®è¡ããã ãã§ãã VMEã¯é¢æ°QMetaObject :: metacallïŒQMetaObject :: WritePropertyã...ïŒãåŒã³åºãã ãã§ãæçµçã«ã¯QQuickRectangle :: SetWidthïŒïŒã®åŒã³åºãã§çµäºããŸãã ãã®å²ãåœãŠã®åŸã QMLãšã³ãžã³ã¯ãã®å²ãåœãŠãå¿ããŠããŸãã
- äžèšã®äŸã®ããã«ã ããã¹ãããããã£ãžã®ããŠã£ã³ããŠé åïŒã+ïŒparent.width * parent.heightïŒãŸãã¯centerInããããã£ãžã®èŠªã®ãã€ã³ãã£ã³ã°å²ãåœãŠã ãã€ã³ãã£ã³ã°ã®éæ³ã®ãããã§ãRectangleèŠçŽ ã®é«ããŸãã¯å¹
ã倿Žããããã³ã«ã ããã¹ãããããã£ãèªåçã«æŽæ°ãããŸãã ã©ã®ããã«æ©èœããŸããïŒ éæ³ã¯ãŸã£ãããããŸãããçããèŠã€ããããã«èªã¿é²ããŠãã ããã
ãã€ã³ãã£ã³ã°ãäœæ
ãã©ã¡ãŒã¿ãŒQML_COMPILER_DUMP = 1ãèšå®ãããšããã€ã³ããŒãSTORE_COMPILED_BINDINGã¹ããŒãã¡ã³ãã«ãã£ãŠäœæãããŠããããšãããããŸãã
... 9 STORE_COMPILED_BINDING 43 1 0 10 FETCH 19 11 STORE_COMPILED_BINDING 17 0 1 ...
ã³ã³ãã€ã«æžã¿ãã€ã³ãã£ã³ã°ãããã¯å®éã«ã¯æé©åããããªãã·ã§ã³ã§ãã STORE_BINDINGã¹ããŒãã¡ã³ãã«ãã£ãŠäœæãããéåžžã®ãã€ã³ãã£ã³ã°ãèŠãŠã¿ãŸãããã QQmlVME :: runïŒïŒé¢æ°ã¯ã QQmlBindingãªããžã§ã¯ããäœæãããã©ãŒã ã®æååãæž¡ããŸã function $text() { return âWindow Area: â + (parent.width * parent.height) }
ããã¯JSåŒã§ãã
ããã§ãããã¹ãŠã®ãã€ã³ãã£ã³ã°ã¯JavaScript颿°ã§ãã 颿°ãfunction $ textïŒïŒãã®äžéšã¯QMLã³ã³ãã€ã©ãŒã«ãã£ãŠè¿œå ãããŸãããã®ãããQMLã®JMLãšã³ãžã³ã§ããV8ã¯ããæ³åã®ãšãããJSã³ãŒãã®ã¿ãå®è¡ã§ããŸãã æåå颿°ã¯ãv8ã³ã³ãã€ã©ãŒã«ãã£ãŠv8 :: Functionãªããžã§ã¯ãã«ã³ã³ãã€ã«ãããŸãã v8ãšã³ãžã³ã¯ãçµã¿èŸŒã¿ã®JITã³ã³ãã€ã©ãŒã«ããããã€ãã£ãã³ãŒããäœæããŸãã äœæãããv8 :: Functionãªããžã§ã¯ãã¯å®è¡ããŸããããå°æ¥ã®ããã«ä¿åããŸãã
åèšïŒSTORE_BINDINGã¹ããŒãã¡ã³ããå®è¡ãããšãQQmlBindingãªããžã§ã¯ããäœæãããŸããQQmlBindingãªããžã§ã¯ãã¯ãæž¡ããã颿°ãæååãšããŠv8 :: Functionãªããžã§ã¯ãã«ã³ã³ãã€ã«ããçµã¿èŸŒã¿ã®V8 JSãšã³ãžã³ã䜿çšããŸãã
ãã€ã³ã
ããæç¹ã§ããã€ã³ãã£ã³ã°ãå®è¡ããå¿
èŠããããŸããã€ãŸããV8ã¯ãã€ã³ãã£ã³ã°æ¬äœã§æž¡ããã颿°ãå®è¡ããå²ãåœãŠã®çµæãè¿ããŠã¿ãŒã²ããããããã£ã«å²ãåœãŠãå¿
èŠããããŸãã ãã®åŒã³åºãã¯ãäž»ã«äœæãã§ãŒãºã®çµããã«çºçããŸããQQmlVME:: completeïŒïŒé¢æ°ã¯ããã€ã³ãã£ã³ã°ããšã«updateïŒïŒã¡ãœãããé çªã«åŒã³åºããŸãã ãã®å Žåã QQmlBinding :: updateïŒïŒé¢æ°ãåŒã³åºãããŸãã updateïŒïŒã¡ãœããã¯ãåã«v8 :: Functionãªããžã§ã¯ãã®ã³ã³ãã³ããå®è¡ããå®è¡çµæãåè§åœ¢ã®textããããã£ã«æžã蟌ã¿ãŸãã
ããããã¡ãã£ãšãV8ã¯å€æ°parent.widthãšparent.heightã®æå³ãã©ã®ããã«åŠç¿ããŸããïŒ ç¢ºãã«ã圌ã¯ã©ã®ããã«èŠªã«ã€ããŠåŠã¶ã®ã§ããããïŒ åçïŒV8ã¯ãQMLãã¡ã€ã«ã§è¡šãããQObjectã¿ã€ãã®ãªããžã§ã¯ãã«ã€ããŠãããããã®ããããã£ã®æ§æã«ã€ããŠãäœãç¥ããŸããã V8ã¯ãæªç¥ã®ãªããžã§ã¯ããŸãã¯ãªããžã§ã¯ãã®æªç¥ã®ããããã£ã«ééãããšãQMLãšã³ãžã³ã®ã©ãããŒãªããžã§ã¯ãã«è³ªåããé©åãªãªããžã§ã¯ããŸãã¯ããããã£ãèŠã€ããŠV8ã«è¿ããŸãïŒãŸãã¯ãã®å€ïŒã äŸãšããŠããã®ãã³ãã䜿çšããŠQQuickItemãªããžã§ã¯ãã®widthããããã£ã«ã¢ã¯ã»ã¹ããæ¹æ³ãèŠãŠã¿ãŸãããã
qv8qobjectwrapper.cppãã¡ã€ã«ã®ã©ãããŒãQObject :: qt_metacallïŒQMetaObject :: ReadPropertyã...ïŒé¢æ°ãåŒã³åºããŠãå¿
èŠãªããããã£ã®å€ãååŸããŠããããšãããããŸãã WrapperïŒWrapper ObjectïŒã¯ãV8 :: Functionã«ä¿åãããŠããã³ã³ãã€ã«æžã¿V8ã³ãŒãããåŒã³åºãããŸããã æ®å¿µãªãããçæããããã·ã³ã³ãŒãã«ã¯ã³ãŒã«ã¹ã¿ãã¯ããªããããGDBã¯äœãèµ·ãã£ãŠããã®ãã衚瀺ã§ããŸããã ã å°ãééããŠãäžèšã®2ã€ã®ç°ãªãã³ãŒã«ã¹ã¿ãã¯ã瀺ããŸãããããã¯ãè¡çªå·ä»ãã®ã®ã£ãããå°ã説æããŠããŸãã
ç¹°ãè¿ããŸãããV8ã¯ãªããžã§ã¯ãã©ãããŒã䜿çšããŠããããã£å€ãååŸããŸãã åæ§ã«ããªããžã§ã¯ãèªäœãæ€çŽ¢ã§ããã³ã³ããã¹ãã©ãããŒã䜿çšããŸãã ããšãã°ããã€ã³ãã£ã³ã°äžã«åç
§ããŠãã芪ãªããžã§ã¯ãã
ãã®ããããã€ã³ãã£ã³ã°ã¯V8 ::颿°ã³ãŒããå®è¡ããããšã«ãã£ãŠè¡ãããŸãã V8ãšã³ãžã³ã¯ãQtããã©ãããŒãåŒã³åºãããšã«ãããæªç¥ã®ãªããžã§ã¯ããšããããã£ã«ã¢ã¯ã»ã¹ããŸãã V8 :: Functionã®çµæã¯ãã¿ãŒã²ããããããã£ã«æžã蟌ãŸããŸãã
ãã€ã³ãã£ã³ã°æŽæ°
ããŠãããã¹ãããããã£ãå
ã®æå³ãã©ã®ããã«ååŸããããããããŸããã æŽæ°ã¯ã©ãã§ããïŒ QMLãšã³ãžã³ã¯ãèŠªé·æ¹åœ¢ã®é«ããŸãã¯å¹
ã倿Žããããšãã«ãã®ããããã£ãæŽæ°ããå¿
èŠãããããšãã©ã®ããã«èªèããŸããïŒ
ãã®è³ªåã«å¯Ÿããçãã¯ãåããªããžã§ã¯ãã©ãããŒã«ãããŸããããã¯ãèŠããŠããããã«ãV8ãããããã£ã«ã¢ã¯ã»ã¹ããå¿
èŠããããšãã«åŒã³åºãããŸãã ã©ãããŒã¯ãããããã£ã®å€ãè¿ãã ãã§ã¯ãªããã¢ã¯ã»ã¹ãèŠæ±ããããã¹ãŠã®ããããã£ãèšé²ããŸãã åºæ¬çã«ãããããã£ãžã®ã¢ã¯ã»ã¹ãçºçãããšãã©ãããŒã¯çŸåšå®è¡äžã®ã¹ããããã£ããã£æ©èœãåŒã³åºããŸãã ãã®äŸã§ã¯ãããã¯QQmlJavaScriptExpression :: GuardCapture :: capturePropertyïŒïŒã§ã ïŒQQmlBindingã¯QQmlJavaScriptExpressionã¯ã©ã¹ã®ãµãã¯ã©ã¹ã§ãïŒã
ãã£ããã£ãŒé¢æ°ã§ã¯ããã€ã³ãã£ã³ã°ã¯åã«ãèŠæ±ãããããããã£ã®NOTIFYã¿ã€ãã®ä¿¡å·ã«åçŽã«æ·»ä»ãããŸãã ããã§ãNOTIFYã·ã°ãã«ãåŒã³åºããããšãããã«æ¥ç¶ãããŠãããã€ã³ãã£ã³ã°ã¹ããããåŒã³åºããããã€ã³ãã£ã³ã°èªäœãåèµ·åãããŸãã NOTIFYã·ã°ãã«ãèããããšããªãå Žåãå¿é
ããªãã§ãã ããããã®ããžãã¯ã¯åçŽã§ãïŒQ_PROPERTYãã¯ãã䜿çšããŠããããã£ãå®çŸ©ããããšããã®å Žæã«NOTIFYã·ã°ãã«ãåžžã«ååšãããã®ããããã£ã倿Žããããã³ã«éä¿¡ãããŸãã
ããšãã°ãQQuickItemã¯ã©ã¹ã®widthããããã£ã®å®£èšã¯æ¬¡ã®ãšããã§ãã
Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged)
ãã®ã·ããªãªã§ã¯ããã€ã³ãã®æåã®éå§æã«åããŠwidthããããã£ã«ã¢ã¯ã»ã¹ãããšãããããã£ãã£ããã£é¢æ°ã¯widthChangedïŒïŒä¿¡å·ãšãã€ã³ãã®èµ·åã¹ããããæ¥ç¶ããŸãã ããã§ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«QQuickItemãªããžã§ã¯ããwidthChangedïŒïŒã·ã°ãã«ãçºè¡ãããšãããã«é¢é£ä»ããããŠãããã¹ãŠã®ãã€ã³ãã£ã³ã°ãåŒã³åºãããåèµ·åãããŸãã
èªå·±å®çŸ©ããããã£ã«NOTIFYã·ã°ãã«ãèšå®ããããããã£ã倿Žããããã³ã«éä¿¡ããããšãéåžžã«éèŠã§ãã ãããè¡ãã®ãå¿ãããšããã€ã³ãã£ã³ã°ã¯åèµ·åãããªããããããããã£ã®ãã€ã³ãã£ã³ã°ã¯æ£ããæ©èœããŸããã äžæ¹ãããããã£ã倿ŽãããŠããªããšãã«NOTIFYã·ã°ãã«ãéä¿¡ããããšããã€ã³ãã£ã³ã°ã¯ã¢ã€ãã«ç¶æ
ã«ãªããŸãã
èŠçŽãããšãããããã£ã«ã¢ã¯ã»ã¹ãããšãã©ãããŒãªããžã§ã¯ãã¯ãã€ã³ãã£ã³ã°ãããã£ããã£é¢æ°ãåŒã³åºããŸããããã«ããããã®ãã€ã³ãã£ã³ã°ãããããã£ã®NOTIFYã·ã°ãã«ã«ã¢ã¿ãããããããããã£ã倿Žããããšãã«ãã€ã³ãã£ã³ã°ãå床å®è¡ãããŸã...
ãããã«
仿¥ã¯ãQMLã§ãã€ã³ãã£ã³ã°ãã©ã®ããã«æ©èœããããèŠãŸããã ç°¡åã«èª¬æãããšããã€ã³ãã£ã³ã°ã¯ãé¢é£ããããããã£ã倿Žããããã³ã«å®è¡ãããJS颿°ã§ãã
ãã®èšäºãçããã«ãšã£ãŠè峿·±ããã®ã§ãã£ãããšãé¡ã£ãŠããŸããäŸãã°ããã€ã³ãã£ã³ã°ã®å
éšããžãã¯ãç ç©¶ããããšã¯ãšãŠãè峿·±ããã®ã§ããã
次ã®èšäºã§ã¯ãããŸããŸãªã¿ã€ãã®ãã€ã³ãã£ã³ã°ã«ã€ããŠæ€èšããŸãã 仿¥èª¿ã¹ãã®ã¯åºæ¬çãªãã€ã³ãã£ã³ã°ïŒQQmlBindingïŒã ãã§ãããã³ããŒããããã€ã³ãã£ã³ã°ãªã©ãä»ã®ã¿ã€ããããããšã¯ããã£ãŠããŸãã è¿ããã¡ã«åœŒãã®ç§å¯ã解決ããŸãã®ã§ããæ¥œãã¿ã«ïŒ