PyQt QML 错误控制台丢失。

3
标题已经说得很清楚了。
假设我有一个简单的应用程序:
main.py >>>
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView

# Main Function
if __name__ == '__main__':
    # Create main app
    myApp = QApplication(sys.argv)
    # Create a label and set its properties
    appLabel = QQuickView()
    appLabel.setSource(QUrl('main.qml'))

    # Show the Label
    appLabel.show()

    # Execute the Application and Exit
    myApp.exec_()
    sys.exit()

main.qml >>>

import QtQuick 2.0

Rectangle {
    width: 250; height: 175

    Text {
        id: helloText
        anchors.verticalCenter: parent.verticalCenter
        anchors.horizontalCenter: parent.horizontalCenter
        text: "Hello World!!!\n Traditional first app using PyQt5"
        horizontalAlignment: Text.AlignHCenter
    }
}

现在这个例子运行良好。但是假设我在main.qml中打错字,我把"height"写成了"heigth"。那么Python代码将继续工作,但会启动一个没有任何错误信息的空窗口。
我该怎么做才能在Python控制台中看到.qml文件中的错误?在6000行代码中找错太痛苦了。
我正在使用PyQt 5.5.1、Anaconda 2.4.1(Python 3.5.1)、Windows 8.1。

QQuickView.errors - ekhumoro
很好,但如果我想在发生除以零的情况下精确打印一些内容怎么办? - Ford O.
这个问题在这里被 @eyllanesc 很好地回答了:PySide 如何在 Python 控制台中查看 QML 错误? - Mohammed
这个问题在这里被@eyllanesc很好地回答了:PySide如何在Python控制台中查看QML错误? - Mohammed
1个回答

1
如果你只是想在控制台上看到错误输出,那么不需要做任何事情,因为Qt自动完成了。例如,如果我在您的示例中将height更改为heigth,则会在stderr上打印以下消息:

file:///home/foo/test/main.qml:4:17: Cannot assign to non-existent property "heigth" width: 250; heigth: 175

如果你想在应用程序中引发异常,可以连接到statusChanged信号并从errors方法获取详细信息:
    def handleStatusChange(status):
        if status == QQuickView.Error:
            errors = appLabel.errors()
            if errors:
                raise Exception(errors[0].description())

    appLabel = QQuickView()
    appLabel.statusChanged.connect(handleStatusChange)

1
如果你只想在控制台上看到错误输出,那么你不需要做任何事情,因为Qt会自动完成。但是对于我来说并非如此,我实际上必须手动打印错误信息。 - Gallaecio
@Gallaecio。使用Qt-5.7.0和PyQt-5.7,这个示例仍然完全正常运行。 - ekhumoro
我并不是说这个例子不能运行,我是说如果你只想要错误输出而不是引发异常,你不能像引用的文本所建议的那样什么都不做。你必须使用像你的例子中的代码,并自己打印错误消息。至少这是我必须做的,我正在使用相同版本的Qt(和Python 3,不确定是否有区别)。 - Gallaecio
@Gallaecio。嗯,我并没有说你说它不起作用 - 我只是说它对我来说起作用相同(即在此期间没有任何变化)。也就是说,如果我运行OP的原始示例,并将“height”更改为“heigth”,Qt将在stderr上打印该消息。不需要statusChanged处理程序或任何其他附加代码。如果您的系统不按照这种方式工作,我会说它没有正确设置(至少不适用于开发工作)。 - ekhumoro
@Gallaecio。PS:可能是你的Qt安装没有启用QML调试功能。你有没有看到过这样的消息:“QML调试已启用。请在安全环境中使用。”? - ekhumoro
我没有看到那个消息,这一定是原因。 - Gallaecio

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