Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ReferenceError: "something" is not defined in QML

I have Main.qml file like this:

import QtQuick 2.0    

Rectangle {
    color: ggg.Colors.notificationMouseOverColor
    width: 1024
    height: 768
}

in python file, i have this(i use form PyQt5):

App = QGuiApplication(sys.argv)
View = QQuickView()
View.setSource(QUrl('views/sc_side/Main.qml'))
Context = View.rootContext()

GlobalConfig = Config('sc').getGlobalConfig()
print (GlobalConfig, type(GlobalConfig))
Context.setContextProperty('ggg', GlobalConfig)

View.setResizeMode(QQuickView.SizeRootObjectToView)
View.showFullScreen()
sys.exit(App.exec_())

this python code print this for config:

{'Colors': {'chatInputBackgroundColor': '#AFAFAF', 'sideButtonSelectedColor': '#4872E8', 'sideButtonTextColor': '#787878', 'sideButtonSelectedTextColor': '#E2EBFC', 'sideButtonMouseOverColor': '#DDDDDD', 'buttonBorderColor': '#818181', 'notificationMouseOverColor': '#383838', }} <class 'dict'>

when i run this code, my rectangle color change correctly, but i have this error:

file:///.../views/sc_side/Main.qml:6: ReferenceError: ggg is not defined

but i don't know why this error happend, how i can fix this error?

like image 459
Vahid Kharazi Avatar asked Jan 29 '14 11:01

Vahid Kharazi


2 Answers

You need to set the context property before you call View.setSource, otherwise at the moment the qml file is read the property ggg is indeed not defined.

Try this:

App = QGuiApplication(sys.argv)
View = QQuickView()
Context = View.rootContext()

GlobalConfig = Config('sc').getGlobalConfig()
print (GlobalConfig, type(GlobalConfig))
Context.setContextProperty('ggg', GlobalConfig)

View.setSource(QUrl('views/sc_side/Main.qml'))    
View.setResizeMode(QQuickView.SizeRootObjectToView)
View.showFullScreen()
sys.exit(App.exec_())

Disclaimer: without knowing what Config is, I can't say if it will really work without any other modification.

like image 180
mata Avatar answered Oct 20 '22 23:10

mata


You have to define the context property before loading QML file, it's better because it avoids warnings and context reloading.

If you are REALLY forced to do it after, just add a security in your QML code :

color: (typeof (ggg) !== "undefined" ? ggg.Colors.notificationMouseOverColor : "transparent");

Then when you will set the context property it will reload the context (not recommanded) but at least no error will happen.

like image 34
TheBootroo Avatar answered Oct 20 '22 22:10

TheBootroo