2017-08-21 53 views
1

我正在PyQt应用程序中加载QML文件,并且我想在QML文件无效的情况下显示错误和警告消息。在这种情况下,QQmlApplicationEngine应该发出warnings信号,但这似乎不会发生。在下面的代码中,如果QML文件包含错误,则它不会被加载,但display_warnings插槽永远不会被调用。我究竟做错了什么? PyQt版本是5.9。QQmlApplicationEngine不发出警告信号

# -*- coding: utf-8 -*- 
from PyQt5.QtGui import QGuiApplication 
from PyQt5.QtQml import QQmlApplicationEngine 

def display_warnings(warnings): 
    pass # Process warnings 

if __name__ == '__main__': 
    import os 
    import sys 
    app = QGuiApplication(sys.argv) 
    engine = QQmlApplicationEngine() 
    engine.warnings.connect(display_warnings) 
    qml_filename = os.path.join(os.path.dirname(__file__), 'MainWindow.qml') 
    engine.load(qml_filename) 
    sys.exit(app.exec_()) 

回答

0

我不知道它如何在Python中工作,但在C++中工作正常,即。所有QML错误报告:

QQmlApplicationEngine engine; 
QObject::connect(&engine, &QQmlApplicationEngine::warnings, [=] (const QList<QQmlError> &warnings) { 
    foreach (const QQmlError &error, warnings) { 
     qWarning() << "warning: " << error.toString(); 
    } 
}); 

注意,在这种情况下的连接类型是Qt::DirectConnection。实际上所有的错误都和控制台的一样。

在我的测试中错误的代码错误anchors.centerIn: parnt将两次报道,一个错误的控制台和warnings信号处理程序一个错误:

warning: "qrc:/main.qml:13: ReferenceError: parnt is not defined"

qrc:/main.qml:13: ReferenceError: parnt is not defined

所以,你应该检查一下你的QML代码包含错误的一切,还要检查你的控制台是否产生了一些警告。

+0

QML代码肯定包含错误,但控制台中没有显示任何内容。这可能是一个PyQt问题,但PyQt文档中关于QQmlApplicationEngine的内容并不多。 –