如何通过Qt Quick Test测试QAbstractListModel?

时间:2014-04-04 09:58:24

标签: c++ qt testing qml

我编写了一个QAbstractListModel类来将我的库中的数据公开给QML。它似乎与QML ListView组件一起正常工作,但我想为它编写一些测试以确保它继续运行。

我一直在通过Qt Quick Test测试我的QML模块的其他部分,但无法确定如何直接从QML访问模型。我正在处理简单的事情,例如检查行数,以及访问模型中任意行的角色数据值。

这实际上是可行的,还是我需要用C ++编写测试?

2 个答案:

答案 0 :(得分:2)

这是我一直要自己查找的主题,我仍然有点不确定,所以可能有比我建议更好的方法。无论如何,QAbstractItemModel似乎没有提供您尝试测试的功能。我可以想出两种方法来解决这个问题。

自己添加

#include <QtGui/QGuiApplication>
#include <QQmlContext>
#include <QQuickView>
#include <QDebug>
#include "qtquick2applicationviewer.h"

#include "QAbstractListModel"

class Model : public QAbstractListModel
{
    Q_OBJECT
public:
    Model() {}

    int rowCount(const QModelIndex &parent) const
    {
        return mList.size();
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const{
        if (index.row() < 0 || index.row() >= mList.size()) {
            return QVariant();
        }
        return mList.at(index.row());
    }

    Q_INVOKABLE QVariant get(int index) {
        return data(createIndex(index, 0));
    }

    Q_INVOKABLE void append(QVariant element) {
        beginInsertRows(QModelIndex(), mList.size() + 1, mList.size() + 1);
        mList.append(element.toMap().value("name").toString());
        endInsertRows();
    }
private:
    QList<QString> mList;
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QtQuick2ApplicationViewer viewer;
    Model model;
    viewer.rootContext()->setContextProperty("model", &model);
    viewer.setMainQmlFile(QStringLiteral("qml/quick/main.qml"));
    viewer.showExpanded();

    return app.exec();
}

#include "main.moc"

这是QML测试用例的一小部分:

import QtQuick 2.2

Item {
    width: 360
    height: 360

    Component.onCompleted: {
        model.append({name: "blah"});
        console.assert(model.get(0) === "blah");
    }
}

使用QQmlListProperty

这仅在您的模型是或可以由QObject子类包装时才有用,正如其名称所示,它被用作对象的属性。它很方便,但不如第一个选项灵活,因为它只能存储QObject派生的对象指针。我不会详细介绍这个,因为我假设这与你的用例无关。

您可以在下面找到更多信息:

Using C++ Models with Qt Quick Views

答案 1 :(得分:2)

我知道这个话题已经过时了,但无论如何,这是你的答案。

在cpp端定义QAbstractListModel后,您可以通过委托的属性访问委托的角色:

import QtQuick 2.5
import QtTest 1.0

Item {
    width: 1    // the minimum size of visible compoment
    height: 1   // the minimum size of visible compoment

    ListView {
        id: testView
        model: yourModelId
        delegate: Item {
            property variant dataModel: model
        }
    }

    TestCase {
        when: windowShown

        function test_dataModelReadDelegate() {
            testView.currentIndex = 0
            testView.currentItem.dataModel["yourRole"]);
        }
    }
}

注意,ListView必须是可见的(同样TestCase等待,直到windowShown为真),否则将不会创建代理(TestCase本身是不可见的组件)。

由于某种原因,当根项目没有大小时,我会收到有关无效组件大小的警告。