模型中的Qt模型?

时间:2012-12-31 15:34:55

标签: c++ qt model qml

我有一个Qt模型很可能是QAbstractListModel。每个“行”代表我存储在QList中的对象。我在QML的{​​{1}}中显示了此内容。但是,每个对象都有一个恰好是字符串数组的属性。我想在显示该行的委托中将其显示为ListView。但我不知道如何将该模型(对象的字符串数组属性)公开给ListView。我无法通过数据函数公开它,因为模型是QML,不能是QObjects。我想过要使用QVariants,但我仍然不知道如何为QAbstractItemModel获取模型。如果重要,我正在使用ListView 5.0.0版本。

1 个答案:

答案 0 :(得分:5)

您可以从主 QAbstractListModel 返回 QVariantList ,然后可以将其作为模型分配给您在内部的 ListView 代表。我添加了一个小例子,它有一个非常简单的一行模型,内部模型作为例子。

c ++模型类:

class TestModel : public QAbstractListModel
{
  public:

  enum EventRoles {
    StringRole = Qt::UserRole + 1
  };

  TestModel()
  {
    m_roles[ StringRole] = "stringList";
    setRoleNames(m_roles);
  }

  int rowCount(const QModelIndex & = QModelIndex()) const
  {
    return 1;
  }

  QVariant data(const QModelIndex &index, int role) const
  {
    if(role == StringRole)
    {
      QVariantList list;
      list.append("string1");
      list.append("string2");
      return list;
    }
  }

  QHash<int, QByteArray> m_roles;
};

现在您可以将此模型设置为QML并使用它:

ListView {
  anchors.fill: parent
  model: theModel //this is your main model

  delegate:
    Rectangle {
      height: 100
      width: 100
      color: "red"

      ListView {
        anchors.fill: parent
        model: stringList //the internal QVariantList
        delegate: Rectangle {
          width: 50
          height: 50
          color: "green"
          border.color: "black"
          Text {
            text: modelData //role to get data from internal model
          }
        }
      }
    }
}