簡體   English   中英

如何通過Qt快速測試來測試QAbstractListModel?

[英]How can I test a QAbstractListModel via Qt Quick Test?

我編寫了一個QAbstractListModel類,以將我的庫中的數據公開給QML。 它似乎可以與QML ListView組件一起正常工作,但是我想為其編寫一些測試以確保其繼續運行。

我一直在通過Qt Quick Test測試我的QML模塊的其他部分,但無法解決如何直接從QML訪問模型的問題。 我正在做一些簡單的事情,例如檢查行數,以及訪問模型中任意行的角色數據值。

這實際上可行嗎,還是我需要用C ++編寫測試?

這是我始終必須自我檢查的主題,但我仍然不確定,因此可能有比我建議的更好的方法。 無論如何,似乎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子類包裝時,這才有用,正如其名稱所暗示的那樣,它用作對象的屬性。 它的便利性很有用,但靈活性不如第一個選項,因為它只能存儲QObject派生的對象指針。 我不會對此進行詳細介紹,因為我認為這與您的用例無關。

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

將C ++模型與Qt快速視圖一起使用

我知道這個話題很老,但是無論如何這是您的答案。

一旦在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為true為止),否則將不會創建委托( TestCase本身是不可見的組件)。

出於某種原因,當根項沒有大小時,我將收到有關無效組件大小的警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM