[英]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");
}
}
僅當您的模型是QObject
子類或可以被QObject
子類包裝時,這才有用,正如其名稱所暗示的那樣,它用作對象的屬性。 它的便利性很有用,但靈活性不如第一個選項,因為它只能存儲QObject
派生的對象指針。 我不會對此進行詳細介紹,因為我認為這與您的用例無關。
您可以在下面找到更多信息:
我知道這個話題很老,但是無論如何這是您的答案。
一旦在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.