Solved Random "Invalid grouped property access" error
-
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 :) -
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
-
@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. -
Hi @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.
-
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.
-
@GPBeta
What isMyModule.Templates
? You import it inimports\MyModule\Button.qml
but it's defined nowhere. -
@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
-
@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... -
@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?
-
@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 :)
-
@GPBeta
Thank you for the explanation. Now the randomness makes sense.
Btw. I just checked your webpage. It's quite awesome! -
@Diracsbracket lol, thank you :P