Qt 使用QBStractItemModel返回QQuickPaintedItem以在QML委托中使用

Qt 使用QBStractItemModel返回QQuickPaintedItem以在QML委托中使用,qt,qml,qt-quick,qabstractitemmodel,Qt,Qml,Qt Quick,Qabstractitemmodel,我实现了QQuickPaintedItem的一个子类,该子类将在QML中使用,当通过 qmlRegisterType<T> 一、 当然,通过 void QQmlContext::setContextProperty(const QString & name, QObject * value) 但我不知道如何正确声明ListViews委托,因为“modelData”不起作用 有人知道这是否可行吗?或者你们有更好的解决方案吗? 感谢您的帮助!:) 这也许是可能的,但这与MVC

我实现了QQuickPaintedItem的一个子类,该子类将在QML中使用,当通过

qmlRegisterType<T>
一、 当然,通过

void QQmlContext::setContextProperty(const QString & name, QObject * value)
但我不知道如何正确声明ListViews委托,因为“modelData”不起作用

有人知道这是否可行吗?或者你们有更好的解决方案吗?
感谢您的帮助!:)

这也许是可能的,但这与MVC的理念背道而驰。你的模型不应该知道你的代理。作为一个简化的例子:

main.cpp
#包括
#包括
#包括
Abteilung类:公共QQuickPaintedItem
{
Q_对象
公众:
Abteilung(){
}
空漆(QPainter*油漆工){
画师->设置笔(Qt::红色);
painter->drawRect(boundingRect().adjusted(0,0,-painter->pen().width(),-painter->pen().width());
}
};
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
qmlRegisterType(“测试”,1,0,“Abteilung”);
qqmlaplicationengine;
发动机负荷(QUrl)(QStringletral(“qrc:///main.qml")));
返回app.exec();
}
#包括“main.moc”
main.qml
导入QtQuick 2.2
导入QtQuick.Controls 1.1
导入测试1.0
应用程序窗口{
可见:正确
宽度:640
身高:480
列表视图{
id:abteilungenListView
锚定。填充:父级
间距:5
模型:ListModel{
Component.onCompleted:{
对于(变量i=0;i<100;++i){
追加({name:i});
}
}
}
代表:Abteilung{
宽度:abteilungenListView.width
身高:40
}
}
}

因此我必须根据模型返回的内容在QML中设置QQuickPaintedItem派生类的属性,我是否正确?但它们已经在其他实例中设置,因为它们是在应用程序启动时从数据库读取的。是的,您应该在QML中设置它们,其中每个委托都有模型中特定索引的相关数据。我不知道你所说的“但它们已经在其他实例中设置了,因为它们是在应用程序启动时从数据库中读取的。”。这样做意味着每个对象将有2个实例。一个存储信息来提供模型的C++侧的数据和一个在QML侧画的项目,对吗?很难说没有看到你的完整代码。据我从您的问题中了解,绘图是在
QQuickPaintedItem
子类中完成的。该子类应该定义一些属性,这些属性可以从委托的QML实例中设置。
ListView {
    id: abteilungenListView
    anchors.fill: parent
    spacing: 5
    model: abteilungen
    delegate: modelData
}
void QQmlContext::setContextProperty(const QString & name, QObject * value)
#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
        }
    }
}