繁体   English   中英

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

[英]How to display a simple QMap in a QTableView in Qt?

我有一个名为mapQMap 我用数据库中的几行数据初始化了这张map 现在我将此map发送到另一个包含 GUI 类的类。 在我的 GUI 中,我有一个 TableView 项目。 我需要在此 TableView 中以任何顺序显示此map

我看过几个例子,但所有这些都是针对一个只有一个字段的向量。 他们使用另一个类来形成视图。 我想知道是否有人以前这样做过并且可以帮助我。

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

文件“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();
}

使用示例:

// ...
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);
// ...

它将显示一个填充如下的表格视图:

在此处输入图片说明

正如@André 所说,依赖QMap keys()values()方法的解决方案根本没有效率,不应使用。 相反,您应该使用迭代器!

所以使用相同的 .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;
    void setMap(QMap<int, QString>* map);

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

#endif // MAPMODEL_H

cpp 将是这样的:

#include "mapmodel.h"

MapModel::MapModel(QObject *parent) :
    QAbstractTableModel(parent), _map(nullptr)
{}

void MapModel::setMap(QMap<int, QString>* map)
{
    beginModelReset();
    _map = map;
    endModelReset();
}

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 || !index.isValid() || index.row() >= _map->count() || role != Qt::DisplayRole)
        return QVariant();

    auto it = _map.cbegin();
    it += index.row();

    if (index.column() == 0)
        return it.key();
    if (index.column() == 1)
        return it.value();

    return QVariant();
}

主要的变化是在MapModel::data中使用迭代器,正如@Claudiu 评论的那样,您必须在MapModel::setMap使用beginModelResetendModelReset (让您能够更改模型上的地图并为您的视图发出信号)

如果你想要一些例子,我已经在FamilyModel2上为QAbstractListModel做了它。 这是标题这里是 cpp 它正在使用您可以在此处找到的 Map 包装器。 检查连接外部信号的构造函数FamilyModel2::FamilyModel2以管理条目的插入并在数据更新时发出dataChanged ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM