python — ReferenceError: & quot; что-то & quot; не определен в 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 распечатать это для конфигурации:

{'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

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

8

Решение

Вам нужно установить свойство контекста до ты звонишь 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 Я не могу сказать, будет ли он действительно работать без каких-либо других модификаций.

13

Другие решения

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

Если вы ДЕЙСТВИТЕЛЬНО вынуждены сделать это после, просто добавьте защиту в свой код QML:

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

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

7

По вопросам рекламы [email protected]