PySide如何在Python控制台中查看QML错误?

5

我有以下代码:

if __name__ == '__main__':
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    engine.load('./QML/main.qml')

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

您可以看到,如果 `engine.load` 失败,我将只会看到一个“-1”退出代码,没有任何关于为什么失败以及错误发生的详细说明。如何在Python控制台中打印QML错误信息?
使用 QQuickView 而不是 QQmlApplicationEngine 时有一种解决方法,并在这个 帖子 中进行了描述,但我想知道是否可以为 QQmlApplicationEngine 实现类似的功能?

相对路径 https://stackoverflow.com/questions/45805076/qqmlapplicationengine-not-emitting-warnings-signal - eyllanesc
@eyllanesc 我尝试将 QQmlEngine::setOutputWarningsToStandardError(bool enabled) 设置为 true,并连接到 warnings 信号... 到目前为止还没有成功... - Curtwagner1984
没错,你已经查看了 https://stackoverflow.com/questions/45805076/qqmlapplicationengine-not-emitting-warnings-signal#comment78589856_45813367: 这很可能是一个错误,我建议你报告它。 - eyllanesc
1个回答

4

如果你想在使用QQmlApplicationEngine时知道错误信息,你应该使用warnings信号,但它似乎不起作用,因此解决方法是使用qInstallMessageHandler来获取Qt给出的消息。

import os
import sys
from PySide2 import QtCore, QtGui, QtQml

def qt_message_handler(mode, context, message):
    if mode == QtCore.QtInfoMsg:
        mode = 'Info'
    elif mode == QtCore.QtWarningMsg:
        mode = 'Warning'
    elif mode == QtCore.QtCriticalMsg:
        mode = 'critical'
    elif mode == QtCore.QtFatalMsg:
        mode = 'fatal'
    else:
        mode = 'Debug'
    print("%s: %s (%s:%d, %s)" % (mode, message, context.file, context.line, context.file))


if __name__ == '__main__':
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
    QtCore.qInstallMessageHandler(qt_message_handler)
    app = QtGui.QGuiApplication(sys.argv)
    engine = QtQml.QQmlApplicationEngine()
    qml_filename = os.path.join(os.path.dirname(__file__), 'QML/main.qml')
    engine.load(QtCore.QUrl.fromLocalFile(qml_filename))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

这似乎在QML文件本身存在错误时有效(例如,当我在“height:”参数中输入字符串值时),但是,在导入存在问题时无效。我在另一个文件中创建了一个委托(与'main.qml'在同一目录中),并尝试将其导入到'main.qml'中,这就是我的engine.load失败的地方。然而,似乎qInstallMessageHandler对于这种情况没有帮助。 - Curtwagner1984
@Curtwagner1984 你可以通过gist或github分享你的测试。 - eyllanesc
@eyllansec 是的,这里是链接:https://gist.github.com/curtwagner1984/c091e4ec262289e2c59e911137d1b5c6 - Curtwagner1984
@eyllansec 我创建了一个新的gist,只包含主函数和一个qml文件: https://gist.github.com/curtwagner1984/e49468256e176867f5c78664eec861a3它可以正常工作,但是如果您尝试导入不存在的文件(取消一些导入的注释),它将返回-1而不指明原因。 - Curtwagner1984
@Curtwagner1984 只适用于以下链接:import 'D:/Windows/Documents/RedditViewer/QML/TestDelegate.qml' 它没有指出错误的原因,对于另外两种情况,它告诉我文件不存在。 - eyllanesc
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接