如何在Qt的QTableView中显示简单的QMap?

Ber*_*ard 5 c++ mysql user-interface qt qtableview

QMap有个叫map.我map用我的数据库中的几行数据初始化它.现在我将它发送map到另一个包含GUI类的类.在我的GUI中,我有一个TableView项.我需要map在这个TableView中以任何顺序显示它.

我已经看过几个例子,但它们都是一个只有一个字段的矢量.他们使用另一个类来形成视图.我想知道是否有人之前已经这样做过,可以帮助我.

mhc*_*rvo 9

将其包装QMap在子类中QAbstractTableModel并将其设置为视图.以下是一个基本功能示例:

文件"mapmodel.h"

#ifndef MAPMODEL_H
#define MAPMODEL_H

#include <QAbstractTableModel>
#include <QMap>

class MapModel : public QAbstractTableModel
{
    Q_OBJECT
public:

    enum MapRoles {
        KeyRole = Qt::UserRole + 1,
        ValueRole
    };

    explicit MapModel(QObject *parent = 0);
    int rowCount(const QModelIndex& parent = QModelIndex()) const;
    int columnCount(const QModelIndex& parent = QModelIndex()) const;
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
    inline void setMap(QMap<int, QString>* map) { _map = map; }

private:
    QMap<int, QString>* _map;
};

#endif // MAPMODEL_H
Run Code Online (Sandbox Code Playgroud)

文件"mapmodel.cpp"

#include "mapmodel.h"

MapModel::MapModel(QObject *parent) :
    QAbstractTableModel(parent)
{
    _map = NULL;
}

int MapModel::rowCount(const QModelIndex& parent) const
{
    if (_map)
        return _map->count();
    return 0;
}

int MapModel::columnCount(const QModelIndex & parent) const
{
    return 2;
}

QVariant MapModel::data(const QModelIndex& index, int role) const
{
    if (!_map)
        return QVariant();
    if (index.row() < 0 ||
        index.row() >= _map->count() ||
        role != Qt::DisplayRole) {
        return QVariant();
    }
    if (index.column() == 0)
        return _map->keys().at(index.row());
    if (index.column() == 1)
        return _map->values().at(index.row());
    return QVariant();
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

// ...
QMap<int, QString> map;
map.insert(1, "value 1");
map.insert(2, "value 2");
map.insert(3, "value 3");

MapModel mapmodel;
mapmodel.setMap(&map);

YourTableView.setModel(&mapmodel);
// ...
Run Code Online (Sandbox Code Playgroud)

它将显示填充的表视图,如下所示:

在此输入图像描述

  • 你想在`setMap`中做`beginModelReset()`和`endModelReset()` (3认同)
  • @mhcuervo 不,这不是您拥有的全部。您可以将数据复制到一个连续的容器中。您还可以在 QMap 中使用迭代器并将其推进到正确的行(并且可能优化它不总是从 begin() 开始,而是从最后使用的 begin() 或 end() 开始,具体取决于哪个最接近或类似的东西)。不理想,但比使用 .keys() 和 .values() 好得多。对于大多数类型,QList 是 _pointers_to_ 堆分配值的连续容器。那根本*不*有效。它正被 Qt6 逐步淘汰。 (3认同)
  • 我永远不建议这样做。.keys() 和 .values() 的使用使得这非常非常低效。这两种方法都会创建一个新容器,然后将 *所有* 数据复制到这个新容器中。更糟糕的是,这个新容器是一个 QList,它本身并不是一个有效的容器,只能用于少数类型。然后,您对经常调用的 data() 的每次调用执行此操作。所以请不要。高效的项目模型需要一个随机访问容器来支持它们。std::vector 是您的首选。 (2认同)