Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将多个模型合并为一个?_C++_Qt_Qml - Fatal编程技术网

C++ 如何将多个模型合并为一个?

C++ 如何将多个模型合并为一个?,c++,qt,qml,C++,Qt,Qml,我已经创建了两个模型,现在需要在一个模型中统一。 它们都继承了QAbstractListModel,只包含角色和简单数据,如QVectorbacking;传递给data()函数的内容 有没有办法将它们合并到一个模型中,并通过委托传递到Qml页面 以下是我的模型: 外部模型 #include "extramodel.h" ExtraModel::ExtraModel(QObject *parent) : QAbstractListModel(parent) { QMap<

我已经创建了两个模型,现在需要在一个模型中统一。 它们都继承了QAbstractListModel,只包含角色和简单数据,如
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"},
    };
}