Random "Invalid grouped property access" error
-
wrote on 8 Aug 2018, 13:12 last edited by GPBeta 8 Aug 2018, 13:18
Hello everyone,
I got a problem confusing me these days when I try to create my ownButton
which directly inheritsQQuickAbstractButton
via C++ .First, I create a new C++ class:
class MyButtonTemplate : public QQuickAbstractButton { // class definitions };
Register it:
const char uri[] = "MyModule.Templates"; qmlRegisterModule(uri, 1, 0); qmlRegisterType<MyButtonTemplate>(uri, 1, 0, "Button");
Refer it in
MyModule
:import QtQuick 2.11 import MyModule.Templates 1.0 as T T.Button { // invalid grouped property (icon) access icon.width: 18 icon.height: 18 }
Then I got a run-time error:
- QQmlApplicationEngine failed to load component
- qrc:/main.qml:17 Type My.Button unavailable
- qrc:///imports/MyModule/Button.qml:10 "T.Button.icon" is not available in MyModule.Templates 1.0.
- InvalidAccess exited with code -1
So I register the corresponding revision of
QQuickAbstractButton
for my module:qmlRegisterRevision<QQuickAbstractButton, 4>(uri, 1, 0);
Now, my app runs as expected......sometimes :( The program will have around 50% chances to raise an error:
- QQmlApplicationEngine failed to load component
- qrc:/main.qml:15 Type Button unavailable
- file:///F:/DEV/Library/QT/5.11.0/msvc2015_64/qml/QtQuick/Controls.2/Button.qml:56 Invalid grouped property access
- InvalidAccess exited with code -1
Here's my
main.qml
:import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Window 2.11 import MyModule 1.0 as My Window { visible: true title: "Invalid Access" Column { anchors.centerIn: parent Button { text: "Qt Button" } My.Button { text: "My Button" } } }
If I remove the
QtQuick.Controls
'sButton
, program will always raise that error.Environment: Windows 10, Qt 5.11 x64
Here's a minimum demo project:
https://drive.google.com/file/d/1XCjSXlXu4SfulP_hwRVwkoDjejdComHV/view?usp=sharingIs this a bug or something I missed?
Thank you for any ideas :) -
wrote on 9 Aug 2018, 04:21 last edited by
How are you assigning icon? Perhaps you have an undefined property somewhere. Post that code if you have it please.
But in the mean time, use something like this:
T.Button { Component.onCompleted: { // check properties here. Nothing should be undefined, unless it's supposed to be. //for each property, do something like : if (!this_property.isUndefined()) { assign value } //elegant pseudocode else { handle undefined value (avoid crash) } //more elegant pseudocode } }
Let me know how this goes.
Cheers
-
wrote on 9 Aug 2018, 07:59 last edited by GPBeta 8 Sept 2018, 08:04
@devDawg Thank you for your reply :)
Please checkout the completed minimal project to reproduce this issue:https://drive.google.com/file/d/1XCjSXlXu4SfulP_hwRVwkoDjejdComHV/view?usp=sharing
There's no other property access will raise this error, except for this revision tagged and grouped
icon
property which is defined inQQuickAbstractButton
.
TheComponent.onCompleted()
solution is not very suitable for my requirement because it will override bindings created before component completed. -
@devDawg Thank you for your reply :)
Please checkout the completed minimal project to reproduce this issue:https://drive.google.com/file/d/1XCjSXlXu4SfulP_hwRVwkoDjejdComHV/view?usp=sharing
There's no other property access will raise this error, except for this revision tagged and grouped
icon
property which is defined inQQuickAbstractButton
.
TheComponent.onCompleted()
solution is not very suitable for my requirement because it will override bindings created before component completed.wrote on 9 Aug 2018, 10:16 last edited by Diracsbracket 8 Sept 2018, 10:20Hi @GPBeta
I tried your example, it works without problems on my system (Win10, VS2017, Qt 5.11.0).
The "randomness" of the problem seems not reproducible here?My.Button { text: "My Button" onClicked: { console.debug("T.Button: " + icon.height + ", " + icon.width) } }
gives:
qml: T.Button: 18, 18 qml: T.Button: 18, 18 qml: T.Button: 18, 18 ... qml: T.Button: 18, 18 qml: T.Button: 18, 18 qml: T.Button: 18, 18
No warnings nor errors are produced.
-
wrote on 9 Aug 2018, 14:02 last edited by GPBeta 8 Sept 2018, 14:03
Hi @Diracsbracket
The error occurs randomly only on startup, so please try to start it as much as possible, or just removeButton { text: "Qt Button" }
and the program will never start here.
-
Hi @Diracsbracket
The error occurs randomly only on startup, so please try to start it as much as possible, or just removeButton { text: "Qt Button" }
and the program will never start here.
wrote on 9 Aug 2018, 15:18 last edited by@GPBeta
What isMyModule.Templates
? You import it inimports\MyModule\Button.qml
but it's defined nowhere. -
@GPBeta
What isMyModule.Templates
? You import it inimports\MyModule\Button.qml
but it's defined nowhere.wrote on 9 Aug 2018, 15:21 last edited by@Diracsbracket
MyModule.Templates
is registered viaqmlRegisterModule("MyModule.Templates", 1, 0);
T.Button
is registered viaqmlRegisterType<MyButtonTemplate>("MyModule.Templates", 1, 0, "Button");
They're both C++ codes inmain.cpp
-
@Diracsbracket
MyModule.Templates
is registered viaqmlRegisterModule("MyModule.Templates", 1, 0);
T.Button
is registered viaqmlRegisterType<MyButtonTemplate>("MyModule.Templates", 1, 0, "Button");
They're both C++ codes inmain.cpp
wrote on 9 Aug 2018, 16:09 last edited by Diracsbracket 8 Sept 2018, 17:16@GPBeta
My bad... should have read your post more carefully...
I have never defined or even used templates before, so I will just watch and learn from this thread... -
@Diracsbracket
MyModule.Templates
is registered viaqmlRegisterModule("MyModule.Templates", 1, 0);
T.Button
is registered viaqmlRegisterType<MyButtonTemplate>("MyModule.Templates", 1, 0, "Button");
They're both C++ codes inmain.cpp
wrote on 9 Aug 2018, 16:50 last edited by Diracsbracket 8 Sept 2018, 16:56@GPBeta
By adding:import QtQuick.Templates 2.2
to your
Button.qml
template file, it seems to work?import QtQuick 2.11 import QtQuick.Templates 2.2 import MyModule.Templates 1.0 as T
Apparently, without it, the required
QQuickIcon
type fromqtquickcontrols2/src/quicktemplates2/qquickicon_p.h
does not get registered, hence the errors you get?
-
wrote on 9 Aug 2018, 17:27 last edited by
@Diracsbracket Great! It works perfectly now!
The
QQuickIcon
is registered in theQtQuick.Templates
qml plug-in(qtquicktemplates2plugin.dll
), while my C++ module only linked againstQt5QuickTemplates2.dll
.So if we don't import that module explicitly, the icon property may be randomly registered later than the binding access.
I also tried to add
depends QtQuick.Templates 2.4
in theqmldir
but with no luck.Whatever, I believe this is the best solution for me, thank you so much :)
-
@Diracsbracket Great! It works perfectly now!
The
QQuickIcon
is registered in theQtQuick.Templates
qml plug-in(qtquicktemplates2plugin.dll
), while my C++ module only linked againstQt5QuickTemplates2.dll
.So if we don't import that module explicitly, the icon property may be randomly registered later than the binding access.
I also tried to add
depends QtQuick.Templates 2.4
in theqmldir
but with no luck.Whatever, I believe this is the best solution for me, thank you so much :)
wrote on 10 Aug 2018, 02:11 last edited by Diracsbracket 8 Oct 2018, 03:41@GPBeta
Thank you for the explanation. Now the randomness makes sense.
Btw. I just checked your webpage. It's quite awesome! -
@GPBeta
Thank you for the explanation. Now the randomness makes sense.
Btw. I just checked your webpage. It's quite awesome!wrote on 10 Aug 2018, 05:15 last edited by@Diracsbracket lol, thank you :P
1/12