如何从 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 模型?的主要内容,如果未能解决你的问题,请参考以下文章