10

我有这样的 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

但我不知道为什么会发生这个错误,我该如何解决这个错误?

4

2 回答 2

18

您需要在调用之前View.setSource设置 context 属性,否则在读取 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,我不能说如果没有任何其他修改它是否真的可以工作。

于 2014-02-02T14:01:27.867 回答
8

您必须在加载 QML 文件之前定义上下文属性,这样会更好,因为它可以避免警告和上下文重新加载。

如果您真的被迫这样做,只需在您的 QML 代码中添加安全性:

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

然后,当您设置上下文属性时,它将重新加载上下文(不推荐),但至少不会发生错误。

于 2014-02-04T15:50:53.760 回答