ReferenceError: "что-то" не определено в QML

у меня есть Main.файл qml выглядит так:

import QtQuick 2.0    

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

в файле python у меня есть это(я использую форму 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_())

этот код python печатает это для config:

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

когда я запускаю этот код, мой цвет прямоугольника изменяется правильно, но у меня есть эта ошибка:

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

но я не знаю, почему эта ошибка случилось, как я могу исправить эту ошибку?

2 ответов


необходимо задать свойство context до вы называете View.setSource, в противном случае в данный момент файл qml считывается свойством ggg действительно не определен.

попробуйте это:

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_())

отказ от ответственности: не зная, что Config есть, я не могу сказать, будет ли он действительно работать без каких-либо других изменений.


перед загрузкой файла QML необходимо определить свойство context, это лучше, потому что это позволяет избежать предупреждений и перезагрузки контекста.

Если вы действительно вынуждены сделать это после, просто добавьте безопасность в свой код QML:

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

затем, когда вы установите свойство context, он перезагрузит контекст (не рекомендуется), но, по крайней мере, ошибка не произойдет.