如何从 C++ 设置 ListView 模型?

Posted

技术标签:

【中文标题】如何从 C++ 设置 ListView 模型?【英文标题】:How to set ListView model from C++? 【发布时间】:2015-08-06 13:32:53 【问题描述】:

我想用 C++ 的 ListView 创建选项卡。添加选项卡的一部分已完成:D 我希望每个 ListView 有一个模型,并且能够从 C++ 端控制模型。 到目前为止,我已经这样做了:

C++部分:

SmsModel *model = new SmsModel();
model->createDummyData(phoneNumber);
QObject* tab = findTab(phoneNumber);
if (tab == nullptr)

  QObject* pRoot = mAppEngine->rootObjects()[0];
  QObject* m_pTabView= pRoot->findChildren<QObject*>("conversationTabView").first();
  if (m_pTabView)
  
  QVariant returnedValue;
  QVariant title = phoneNumber;
  QQmlContext *context = new QQmlContext(mAppEngine, mAppEngine);
  context->setContextProperty(QString("myModel"), model);

  QQmlComponent *component = new QQmlComponent(mAppEngine, QUrl("qrc:/ChatView.qml"), this);
  QObject *object = component->create(context);
  QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
  QObject *p = object->findChild<QObject*>("chatView");
  p->setProperty("model", context->contextProperty("myModel"));
  qDebug() << p->property("model");
  object->setProperty("active", QVariant(true));
  component->setParent(m_pTabView);

  QMetaObject::invokeMethod(m_pTabView, "addTab",
  Q_RETURN_ARG(QVariant, returnedValue),
  Q_ARG(QVariant, title),
  Q_ARG(QVariant, QVariant::fromValue(component)));

  object->setProperty("anchors.fill", "parent");
  

QML 部分:

import QtQuick 2.5
import QtQml.Models 2.2
import QtQuick.Window 2.2
import org.example 1.0

Rectangle 
    color: "#E0E0E0"
    ListView 
        objectName: "chatView"
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        clip: true
        model: myModel
        delegate: bubbleDelegate
        Component 
            id: bubbleDelegate
            Rectangle 
                implicitWidth: messageText.implicitWidth + 2*messageText.anchors.margins
                implicitHeight: messageText.implicitHeight + 2*messageText.anchors.margins
                anchors.left: model.received ? parent.left : undefined
                anchors.right: model.received ? undefined : parent.right
                anchors.margins: 5
                id: bubble
                smooth: true
                radius: 10
                color: model.received ? "#673AB7" : "#E040FB"
                Text 
                    id: messageText
                    anchors.fill: parent
                    anchors.margins: 5
                    text: model.message
                    wrapMode: Text.WordWrap;
                    horizontalAlignment: model.received ? Text.AlignLeft : Text.AlignRight
                    color: "white"
                
            
        
    

当我运行我的应用程序时,GUI 中没有数据,并且出现以下错误 ReferenceError: myModel is not defined.

感谢您的每一个回复。

【问题讨论】:

【参考方案1】:

为了将 C++ 对象用作列表模型,您必须有一个继承自 QAbstractListModel 的类。看看例子here。

【讨论】:

是的,我知道。 SmsModel 继承自 QAbstractListModel。我认为问题存在于上下文中。当我在 rootContext 中执行 setContextProperty("myModel"...) 时,我没有任何错误,但是当我创建两个选项卡时,两个 ListView 共享相同的模型。

以上是关于如何从 C++ 设置 ListView 模型?的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 更改 QML Listview 委托

如何将 QPixmap 从 C++ 模型传递到 QML?

Qt ListView 不显示 C++ 模型内容

如何在 QML 中进行基于状态的模型更改

如何从 Listview.builder 中获取模型类 Flutter 的列表索引

如何通知 ListView DataModel 已更改