Qtで抽象テーブルモデルを使用する方法

QtではQAbstractTableModelを使用するには、そのクラスを継承してデータモデルを定義するために必要ないくつかの関数を実装する必要があります。 以下は簡単な例です。

#include <QAbstractTableModel>
#include <QVariant>

class MyTableModel : public QAbstractTableModel
{
public:
    MyTableModel(QObject *parent = nullptr)
        : QAbstractTableModel(parent)
    {
        // 初始化数据
        m_data = {{"John", 28},
                  {"Amy", 34},
                  {"Michael", 42}};
    }

    // 返回行数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override
    {
        Q_UNUSED(parent);
        return m_data.size();
    }

    // 返回列数
    int columnCount(const QModelIndex &parent = QModelIndex()) const override
    {
        Q_UNUSED(parent);
        return 2;
    }

    // 返回数据
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
    {
        if (!index.isValid())
            return QVariant();

        if (role == Qt::DisplayRole || role == Qt::EditRole)
        {
            if (index.column() == 0)
                return m_data[index.row()].first;
            else if (index.column() == 1)
                return m_data[index.row()].second;
        }

        return QVariant();
    }

    // 设置数据
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
    {
        if (index.isValid() && role == Qt::EditRole)
        {
            if (index.column() == 0)
                m_data[index.row()].first = value.toString();
            else if (index.column() == 1)
                m_data[index.row()].second = value.toInt();

            emit dataChanged(index, index, {role});
            return true;
        }

        return false;
    }

    // 返回表头数据
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
    {
        if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
        {
            if (section == 0)
                return "Name";
            else if (section == 1)
                return "Age";
        }

        return QVariant();
    }

private:
    // 存储数据的容器
    QVector<QPair<QString, int>> m_data;
};

上記の例では、MyTableModelはQAbstractTableModelクラスから継承し、以下の関数を実装しています。

  1. 行数を返すrowCount()
  2. 列の count を取得: columnCount()
  3. 指定したインデックス位置にあるデータを取得します。
  4. setData():指定したインデックス位置のデータをセットします。
  5. headerData():ヘッダーデータを返す。

作成したMyTableModelのインスタンスは、データをテーブルで表示するためにQTableViewに関連付けることができます。例えば:

#include <QApplication>
#include <QTableView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyTableModel model;
    QTableView tableView;
    tableView.setModel(&model);
    tableView.show();

    return a.exec();
}

この例ではQTableViewオブジェクトを作成し、MyTableModelに関連付けます。最後に、tableView.show()でテーブルウィンドウを表示します。

bannerAds