åã®æçš¿ã§ãQMLãšã³ãžã³ããã¡ã€ã«ãããŒãããæ¹æ³ãèŠãŠããŸããã æåã«QMLãã¡ã€ã«ã解æããã次ã«äžéãã€ãã³ãŒãã«ã³ã³ãã€ã«ãããæåŸã«ãã€ãã³ãŒãåœä»€ã«åŸã£ãŠãåQMLãã¡ã€ã«ã®åã€ãã³ãã«å¯ŸããŠC ++ãªããžã§ã¯ããäœæãããããšãæãåºããŠãã ããã ããšãã°ãQMLãã¡ã€ã«ã«TextèŠçŽ ãå«ãŸããŠããå Žåããšã³ãžã³ã¯QQuickTextã¯ã©ã¹ã®C ++ã€ã³ã¹ã¿ã³ã¹ãäœæããããšãããããŸããã
å®éããã¡ã€ã«ã®ããŠã³ããŒãã¯QMLãšã³ãžã³ãè¡ãã»ãšãã©ãã¹ãŠã®ããšã§ãã ããŠã³ããŒãåŸãã¢ããªã±ãŒã·ã§ã³ããã»ã¹ãžã®å¹²æžãåæ¢ããŸãã ã©ã³ã¿ã€ã ã®ã€ãã³ãåŠçããã³ã¬ã³ããªã³ã°èŠçŽ ã¯ãå®å šã«C ++ã«äŸåããŸãã ããšãã°ãTextInputèŠçŽ ã¯æ¬¡ã®ãããªã€ãã³ããåŠçããŸã
ãã ããå®è¡æã«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ããããã£ã«ã¢ã¯ã»ã¹ããæ¹æ³ãèŠãŠã¿ãŸãããã
#0 QQuickItem::width (this=0x6d8580) at items/qquickitem.cpp:4711 #1 0x00007ffff78e592d in QQuickItem::qt_metacall (this=0x6d8580, _c=QMetaObject::ReadProperty, _id=8, _a=0x7fffffffc270) at .moc/debug-shared/moc_qquickitem.cpp:675 #2 0x00007ffff7a61689 in QQuickRectangle::qt_metacall (this=0x6d8580, _c=QMetaObject::ReadProperty, _id=9, _a=0x7fffffffc270) at .moc/debug-shared/moc_qquickrectangle_p.cpp:526 #3 0x00007ffff7406dc3 in ReadAccessor::Direct (object=0x6d8580, property=..., output=0x7fffffffc2c8, n=0x0) at qml/v8/qv8qobjectwrapper.cpp:243 #4 0x00007ffff7406330 in GenericValueGetter (info=...) at qml/v8/qv8qobjectwrapper.cpp:296 #5 0x00007ffff49bf16a in v8::internal::JSObject::GetPropertyWithCallback (this=0x363c64f4ccb1, receiver=0x363c64f4ccb1, structure=0x1311a45651a9, name=0x3c3c6811b7f9) at ../3rdparty/v8/src/objects.cc:198 #6 0x00007ffff49c11c3 in v8::internal::Object::GetProperty (this=0x363c64f4ccb1, receiver=0x363c64f4ccb1, result=0x7fffffffc570, name=0x3c3c6811b7f9, attributes=0x7fffffffc5e8) at ../3rdparty/v8/src/objects.cc:627 #7 0x00007ffff495c0f1 in v8::internal::LoadIC::Load (this=0x7fffffffc660, state=v8::internal::UNINITIALIZED, object=..., name=...) at ../3rdparty/v8/src/ic.cc:933 #8 0x00007ffff4960ff5 in v8::internal::LoadIC_Miss (args=..., isolate=0x603070) at ../3rdparty/v8/src/ic.cc:2001 #9 0x000034b88ae0618e in ?? () ... [more ?? frames from the JIT'ed v8::Function code] ... #1 0x00007ffff481c3ef in v8::Function::Call (this=0x694fe0, recv=..., argc=0, argv=0x0) at ../3rdparty/v8/src/api.cc:3709 #2 0x00007ffff7379afd in QQmlJavaScriptExpression::evaluate (this=0x6d7430, context=0x6d8440, function=..., isUndefined=0x7fffffffcd23) at qml/qqmljavascriptexpression.cpp:171 #3 0x00007ffff72b7b85 in QQmlBinding::update (this=0x6d7410, flags=...) at qml/qqmlbinding.cpp:285 #4 0x00007ffff72b8237 in QQmlBinding::setEnabled (this=0x6d7410, e=true, flags=...) at qml/qqmlbinding.cpp:389 #5 0x00007ffff72b8173 in QQmlBinding::setEnabled (This=0x6d7448, e=true, f=...) at qml/qqmlbinding.cpp:370 #6 0x00007ffff72c15fb in QQmlAbstractBinding::setEnabled (this=0x6d7448, e=true, f=...) a /../../qtbase/include/QtQml/5.0.0/QtQml/private/../../../../../../qtdeclarative/src/qml/qml/qqmlabstractbinding_p.h:98 #7 0x00007ffff72dcb14 in QQmlVME::complete (this=0x698930, interrupt=...) at qml/qqmlvme.cpp:1292 #8 0x00007ffff72c72ae in QQmlComponentPrivate::complete (enginePriv=0x650560, state=0x698930) at qml/qqmlcomponent.cpp:919 #9 0x00007ffff72c739b in QQmlComponentPrivate::completeCreate (this=0x698890) at qml/qqmlcomponent.cpp:954 #10 0x00007ffff72c734c in QQmlComponent::completeCreate (this=0x698750) at qml/qqmlcomponent.cpp:947 #11 0x00007ffff72c6b2f in QQmlComponent::create (this=0x698750, context=0x68ea30) at qml/qqmlcomponent.cpp:781 #12 0x00007ffff79d4dce in QQuickView::continueExecute (this=0x7fffffffd2f0) at items/qquickview.cpp:445 #13 0x00007ffff79d3fca in QQuickViewPrivate::execute (this=0x64dc10) at items/qquickview.cpp:106 #14 0x00007ffff79d4400 in QQuickView::setSource (this=0x7fffffffd2f0 at items/qquickview.cpp:243 #15 0x0000000000400d70 in main ()
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ïŒã ãã§ãããã³ããŒããããã€ã³ãã£ã³ã°ãªã©ãä»ã®ã¿ã€ããããããšã¯ããã£ãŠããŸãã è¿ããã¡ã«åœŒãã®ç§å¯ã解決ããŸãã®ã§ãã楜ãã¿ã«ïŒ