在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()
顯示表格窗口。