C++ 如何将多个模型合并为一个?
我已经创建了两个模型,现在需要在一个模型中统一。 它们都继承了QAbstractListModel,只包含角色和简单数据,如C++ 如何将多个模型合并为一个?,c++,qt,qml,C++,Qt,Qml,我已经创建了两个模型,现在需要在一个模型中统一。 它们都继承了QAbstractListModel,只包含角色和简单数据,如QVectorbacking;传递给data()函数的内容 有没有办法将它们合并到一个模型中,并通过委托传递到Qml页面 以下是我的模型: 外部模型 #include "extramodel.h" ExtraModel::ExtraModel(QObject *parent) : QAbstractListModel(parent) { QMap<
QVector
backing;传递给data()函数的内容
有没有办法将它们合并到一个模型中,并通过委托传递到Qml页面
以下是我的模型:
外部模型
#include "extramodel.h"
ExtraModel::ExtraModel(QObject *parent) : QAbstractListModel(parent)
{
QMap<QString, QString> element;
element.insert("SimpleText", "Hello, world!");
backing.append(element);
element.clear();
}
QHash<int, QByteArray> ExtraModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[SimpleTextRole] = "SimpleText";
return roles;
}
QVariant ExtraModel::data(const QModelIndex &index, int role) const
{
if(role == SimpleTextRole)
return backing[index.row()].value("SimpleText");
}
在
ExtraModel
class MainModel : public QObject {
Q_OBJECT
Q_PROPERTY(ExtraModel* extra READ extraModel CONSTANT)
public:
MainModel();
ExtraModel* extraModel() const { return extraModel_; }
private:
ExtraModel* extraModel_ = nullptr;
};
cpp文件:
MainModel::MainModel(QObject *parent)
: QObject(parent)
, extraModel_(new ExtraModel(this))
{
}
那么您的QML将如下所示:
import QtQuick 2.6
import Sailfish.Silica 1.0
import MainModel 1.0
Page {
MainModel {
id: _mainModel
}
SilicaListView {
id: _mainModelView
model: _mainModel.extra
delegate: Rectangle {
Text {
id: _simpleText
text: simpleText
}
}
}
}
顺便说一句,您还应该将第一个字母的角色名称更改为非大写:
QHash<int, QByteArray> ExtraModel::roleNames() const
{
return {
{SimpleTextRole, "simpleText"},
};
}
QHash外部模型::roleNames()常量
{
返回{
{simpleText角色,“simpleText”},
};
}
你能补充一下这两个模型在什么意义上相互关联吗?它只是一个联盟(角色相同)还是更复杂?(可能添加一个视觉解释)@Amfasis,谢谢你的回复。两个模型应该在一个通用模型中,然后我想有可能在不同的视图中使用一个通用模型。是的,这是一个有不同角色的更复杂的联合。如果是非常简单的联合,你可能会得到一个简单的代理模型,但在任何情况下,你都必须自己编写代理模型是什么,我如何使用它将两个模型放在一起?也许,简单的代码示例?如果有QSortFilterProxyModel,那会很有帮助,但实际上我认为它不适合。因此,您必须编写另一个QAbstractListModel,以您认为合适的方式代理这两个模型。但是,如果没有关于您的数据的更多详细信息,您将不会看到任何有用的答案非常感谢您发送的示例!真的很有帮助。我试试看。但我还有一个问题要确定我是否正确:如果我想实现多个模型(如ExtraModel、ExtraModel1等等),那么在.h中创建更多属性,在.cpp文件中创建更多构造函数是否正确?比如…:QObject(父对象),extraModel(新extraModel(this)){}…:QObject(父对象)、extraModel1_U1;(新extraModel1(this)){}。。。。还是用地图之类的东西比较好?或者两者都错了?您确实可以在构造函数中添加Q_属性和extraModel2(新的extraModel2(this))以及所有其他重复的内容。再次感谢您!我已经想好了,我可以再打扰你一次吗?我已将信号添加到ExtraModel()。如何使用MainModel将其传递到.qml页面?我尝试像以前一样使用_mainModel.extra作为组件来调用onSelectedChanged,但它不能作为组件使用。您需要使用连接
对象。但是请问一个问题(或者先搜索),因为这是一个不同的主题,所以我不会编辑这个问题的答案
import QtQuick 2.6
import Sailfish.Silica 1.0
import MainModel 1.0
Page {
MainModel {
id: _mainModel
}
SilicaListView {
id: _mainModelView
model: _mainModel.extra
delegate: Rectangle {
Text {
id: _simpleText
text: simpleText
}
}
}
}
QHash<int, QByteArray> ExtraModel::roleNames() const
{
return {
{SimpleTextRole, "simpleText"},
};
}