Mark,

I have found that the object actually exists but when I make two subsequent 
calls, it fails on the seconds. Look at this:

// not working

MouseArea {
    anchors.fill: parent
    onClicked: {
        console.log("controller: " + controller);
        console.log("here1");
        controller.kernel.setParameter(DRCSynthEngine.KeyboardScale, 22)
        console.log("here2");
        controller.kernel.setParameter(DRCSynthEngine.KeyboardScaleCustom, 
controller.kernel.keyboard.toggleKey(index))
        console.log("here3");
    }
}

// ouput

qml: controller: DRCController(0x7fff5c1f99f0)
qml: here1
qml: here2
qrc:/qml/PanelPerform.qml:131: ReferenceError: controller is not defined

// working

MouseArea {
    anchors.fill: parent
    onClicked: {
        console.log("controller: " + controller);
        var obj = {};

        obj[DRCSynthEngine.KeyboardScale]=22;
        
obj[DRCSynthEngine.KeyboardScaleCustom]=controller.kernel.keyboard.toggleKey(index);

        console.log("here1");
        controller.kernel.setParameters(obj)
        console.log("here2");
    }
}

// outputqml:

qml: controller: DRCController(0x7fff5b96a9f0)
qml: here1
qml: here2

So, the workaround was to have a method to set two parameters at one, using 
only one call to controller instance.

Sometimes I find awkward behaviours on qml which I don’t how to explain…

Regards,

Nuno

> On 30 Nov 2017, at 11:11, Mark Tucker <[email protected]> wrote:
> 
> Hi Nuno,
>  
> Are you attempting to access this "controller" property within a 
> "Component.onCompleted" block of code?
>  
> With Loaders I've found from experience that there's a brief period of time 
> where the component has been created (and therefore its Component.onCompleted 
> signal fires), but it has not yet been fully added to the object heirarchy, 
> so attempting to access anything outside of that object's own scope fails.
>  
> The only way I've ever found to get around this limitation is to instead 
> figure out a way of using the onLoaded signal from the Loader, which seems to 
> be emitted at a point where the QML object is correctly placed within the 
> object heirarchy and can actually correctly access things outside of its own 
> scope.
>  
> The above is my own observations from a number of years of writing QML code - 
> it may be what you're seeing here. I don't know anywhere near enough about 
> how the C++ side of things or how the internals of Qt works to be able to 
> provide any more detail.
>  
> Perhaps you can change the point at which you run this code?
>  
> Mark T
>  
> From: Interest 
> [mailto:[email protected]] On Behalf 
> Of Nuno Santos
> Sent: 30 November 2017 10:11
> To: Qt Project MailingList <[email protected]>
> Subject: [Interest] Awkward Javascript problem
>  
> Hi,
>  
> I usually register a controller property that points to a Controller classe 
> when I start my Qt apps. I can then access the controller from any point of 
> the code in Javascript:
>  
> quickView->rootContext()->setContextProperty("controller", &controller);
>  
> Curiously, I’m having an issue in which inside a MouseArea onClick event, 
> controller is not defined:
>  
> ReferenceError: controller is not defined 
>  
> This MouseArea lives inside a Loader component that is one of the children of 
> a SplitView. 
>  
> Maybe this be the cause for such ReferenceError? How can I workaround this? 
> Any ideas?
>  
> Thanks!
>  
> Regards,
>  
> Nuno

_______________________________________________
Interest mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to