我实现了一个QQuickPaintedItem的子类,用于QML,当通过
注册时,它可以独立工作qmlRegisterType<T>
此类的实例在应用程序启动时创建,并放入存储在QAbstractItemModel的子类中的QList中。我想我可以轻松地返回模型数据方法中的每个对象,并将它们用作QML ListViews委托。 它现在看起来像这样:
Model.cpp:
QVariant AbteilungsModel::data(const QModelIndex &index, int role) const
{
if(index.isValid() && role == Qt::DisplayRole)
{
Abteilung* a = static_cast<Abteilung*>(index.internalPointer());
return QVariant::fromValue(a);
}
}
main.qml:
ListView {
id: abteilungenListView
anchors.fill: parent
spacing: 5
model: abteilungen
delegate: modelData
}
当然,我通过
在QML中提供了该模型void QQmlContext::setContextProperty(const QString & name, QObject * value)
但我不知道如何正确声明ListViews委托,因为&#34; modelData&#34;不起作用。
有人知道这是否可能,或者你们有更好的解决方案吗? 任何帮助表示赞赏! :)
答案 0 :(得分:1)
这可能是可能的,但它违背了整个MVC的想法。您的模型不应该知道您的代表。作为简化示例:
#include <QGuiApplication>
#include <QtQml>
#include <QtQuick>
class Abteilung : public QQuickPaintedItem
{
Q_OBJECT
public:
Abteilung() {
}
void paint(QPainter *painter) {
painter->setPen(Qt::red);
painter->drawRect(boundingRect().adjusted(0, 0, -painter->pen().width(), -painter->pen().width()));
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<Abteilung>("Test", 1, 0, "Abteilung");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
#include "main.moc"
import QtQuick 2.2
import QtQuick.Controls 1.1
import Test 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
ListView {
id: abteilungenListView
anchors.fill: parent
spacing: 5
model: ListModel {
Component.onCompleted: {
for (var i = 0; i < 100; ++i) {
append({name: i});
}
}
}
delegate: Abteilung {
width: abteilungenListView.width
height: 40
}
}
}