我编写了一个QAbstractListModel
类来将我的库中的数据公开给QML。它似乎与QML ListView
组件一起正常工作,但我想为它编写一些测试以确保它继续运行。
我一直在通过Qt Quick Test测试我的QML模块的其他部分,但无法确定如何直接从QML访问模型。我正在处理简单的事情,例如检查行数,以及访问模型中任意行的角色数据值。
这实际上是可行的,还是我需要用C ++编写测试?
答案 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");
}
}
这仅在您的模型是或可以由QObject
子类包装时才有用,正如其名称所示,它被用作对象的属性。它很方便,但不如第一个选项灵活,因为它只能存储QObject
派生的对象指针。我不会详细介绍这个,因为我假设这与你的用例无关。
您可以在下面找到更多信息:
答案 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本身是不可见的组件)。
由于某种原因,当根项目没有大小时,我会收到有关无效组件大小的警告。