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

Posted

技术标签:

【中文标题】PySide 如何在 python 控制台中查看 QML 错误?【英文标题】:PySide How to see QML errors in python console? 【发布时间】:2018-12-31 20:49:16 【问题描述】:

我有以下代码:

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 时,有一个解决方法,在这个post 中有描述,但是,我想知道 QQmlApplicationEngine 是否可以实现类似的东西?

【问题讨论】:

相对***.com/questions/45805076/… @eyllanesc 我尝试将QQmlEngine::setOutputWarningsToStandardError(bool enabled) 设置为true,并连接到warnings 信号......到目前为止没有运气...... 没错,你已经审查了***.com/questions/45805076/…:这可能是一个错误,我建议你报告它。 【参考方案1】:

如果您想知道使用 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 您可以通过 gist 或 github 分享您的测试。 @eyllansec 是的,这里是:gist.github.com/curtwagner1984/c091e4ec262289e2c59e911137d1b5c6 @Curtwagner1984 你没有另一个更简单的例子吗?我不想获得 reddit 的凭据才能测试问题:-) @eyllansec 我已经更改了主文件,添加了一个 moc 子文件,还创建了一个新的“qml”文件。现在它以代码 -1 退出,而不告诉错误是什么。我已经更新了要点当您尝试导入不存在的文件时它对您有用吗? (IE 是否抱怨文件不存在,或者只是以 -1 退出?)

以上是关于PySide 如何在 python 控制台中查看 QML 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Python/pyside,pyqt(pyside,pyqt optional): 控制文本选择的函数

如何使用 PySide 控制 QML UI?

怎么用python2.7解析pyside2

如何在 PySide 和 Python 3.X 中将字节写入 QDataStream?

将 QML 信号连接到 PySide2 插槽

如何从 PySide 访问 QML\QtQuick 控件?