QQmlApplicationEngine 没有发出警告信号

Posted

技术标签:

【中文标题】QQmlApplicationEngine 没有发出警告信号【英文标题】:QQmlApplicationEngine not emitting warnings signal 【发布时间】:2017-08-21 20:29:49 【问题描述】:

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

# -*- 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_())

【问题讨论】:

【参考方案1】:

我不知道它在 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信号处理器报错:

警告:“qrc:/main.qml:13: ReferenceError: parnt is not defined”

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

因此,您应该检查您的 QML 代码是否包含错误,并检查您的控制台是否产生一些警告。

【讨论】:

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

以上是关于QQmlApplicationEngine 没有发出警告信号的主要内容,如果未能解决你的问题,请参考以下文章

QQmlApplicationEngine 列表索引超出范围问题

如何在使用 Qt.quit() 而不是整个 QGuiApplication 时只退出当前的 QQmlApplicationEngine?

qml-main.cpp中的两种启动Qt Quick App模式

从 C++ 更新 QML Window 属性标志

QT qml的入门使用

Qt 解析命令行参数