如何在 Python 中测试 QtQuick Qml

Posted

技术标签:

【中文标题】如何在 Python 中测试 QtQuick Qml【英文标题】:How to test QtQuick Qml in Python 【发布时间】:2018-03-15 19:42:22 【问题描述】:

我正在使用 PyQt 将 QtQuick 集成到我的 Python 应用程序中。我试图找出在 Python unittest 框架中测试我的 QtQuick Qml 页面的最佳方法。我想将 Qml 文件列表传递给某个测试函数,以确保这些文件中的任何一个都不存在错误/异常。目前我正在尝试将页面加载到 QQmlComponent 并检查错误,但我无法使其正常工作:

def test_qml(self):
    app = QApplication(sys.argv)
    engine = QQmlApplicationEngine()
    rel = "/gui/QT/Page1.qml"
    c = QQmlComponent(engine, QUrl.fromLocalFile(SRC_PATH + os.path.normpath(rel)))
    print(c.errors())

此外,从我读过的内容来看,我认为要使用 QQmlComponent 显示错误,我应该在 onStatusChange 上捕获一个信号,然后进行检查,所以这对我来说似乎是错误的方法。尝试在 Python 中测试 qml 页面的最佳方法是什么?

【问题讨论】:

【参考方案1】:

据我了解,您希望使错误消息更具可读性。 errors() 方法返回QQmlError 的列表,并且这个类有一些方法可以为我们提供准确的错误信息:

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtQml import *

type_error_toString =  
    QtDebugMsg: "debug", 
    QtInfoMsg : "info", 
    QtWarningMsg : "wargning",
    QtCriticalMsg: "critical",
    QtFatalMsg: "fatal"


app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
path = "/path/of/item.qml"
c = QQmlComponent(engine, QUrl.fromLocalFile(path))

if c.isError():
    for error in c.errors():
        print(error.toString())
        print("type: , row : , column: , message: "
            .format(
                type_error_toString[error.messageType()],
                error.line(), 
                error.column(),
                error.description())
            )

【讨论】:

嗯,当我尝试创建 QQmlComponent 时出现分段错误,所以现在我什至无法访问 c.isError。我知道路径是正确的,看起来我正确调用了 QQmlComponent...知道为什么会发生这种情况吗? 我确定路径是正确的,我尝试直接使用完整路径并遇到同样的问题。 .qml 我不想放在这里,但它是非常标准的 .qml,它导入 QtQuick 2.9、QtQuick.Controls 2.2,并显示标准 Qml 元素,如矩形和按钮等。当我实际运行时,它可以正常工作程序。 我正在从终端运行 nosetests test_gui.py 来运行它,但仍然出现 seg 错误。我将更新我的问题以包括我正在使用的导入。我在您的更新中使用了我的代码,但我会直接尝试您的代码。 看起来,一旦我从测试类中删除我的代码并在文件级别运行它,它就不再引发 seg 错误。 @Stefan 我建议您首先尝试提供答案的示例,然后将其调整为您的代码,您可能会产生与问题无关的兼容性问题

以上是关于如何在 Python 中测试 QtQuick Qml的主要内容,如果未能解决你的问题,请参考以下文章

如何强制导入旧版本的 QtQuick?

从项目中获取窗口

如何在QML文件里,以模态的方式打开别一个QM

Qt Quick 的单元测试

如何在未聚焦的 QtQuick 项目中接收键盘事件?

如何在 Ubuntu 上安装 QtQuick.Controls 1.4?