在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
类,并实现以下函数:
rowCount()
:返回行数。columnCount()
:返回列数。data()
:返回指定索引位置的数据。setData()
:设置指定索引位置的数据。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()
显示表格窗口。