使用QAbstractItemModel返回QQuickPaintedItem以在QML委托中使用

时间:2014-07-03 16:46:37

标签: qt qml qt-quick qabstractitemmodel

我实现了一个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;不起作用。

有人知道这是否可能,或者你们有更好的解决方案吗? 任何帮助表示赞赏! :)

1 个答案:

答案 0 :(得分:1)

这可能是可能的,但它违背了整个MVC的想法。您的模型不应该知道您的代表。作为简化示例:

的main.cpp

#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"

main.qml

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
        }
    }
}