qtablemodel绑定数据表
时间: 2023-10-21 21:07:16 浏览: 43
在 Qt 中,可以通过实现 QAbstractTableModel 类来创建一个自定义的数据模型,并将其绑定到 QTableView 上。下面是一个简单的示例,演示如何将 QTableView 绑定到一个 SQLite 数据库中的表。
首先,需要包含以下头文件:
```cpp
#include <QAbstractTableModel>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
```
然后,定义一个继承自 QAbstractTableModel 的类,实现其虚函数:
```cpp
class MyTableModel : public QAbstractTableModel
{
public:
MyTableModel(QObject *parent = nullptr);
// 继承自 QAbstractTableModel 的虚函数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// 自定义函数
bool bindTable(const QString& tableName); // 绑定数据库表
private:
QSqlDatabase m_db;
QSqlQuery m_query;
int m_rowCount;
int m_columnCount;
};
```
在构造函数中连接到 SQLite 数据库:
```cpp
MyTableModel::MyTableModel(QObject *parent)
: QAbstractTableModel(parent)
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("database.db");
if (!m_db.open()) {
qWarning() << "Failed to connect to database!";
}
}
```
实现继承自 QAbstractTableModel 的虚函数:
```cpp
int MyTableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_rowCount;
}
int MyTableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_columnCount;
}
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
if (role == Qt::DisplayRole) {
m_query.seek(index.row());
return m_query.value(index.column());
}
return QVariant();
}
QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole) {
return QVariant();
}
if (orientation == Qt::Horizontal) {
return QString("Column %1").arg(section);
} else {
return QString("Row %1").arg(section);
}
}
```
最后,实现自定义函数 `bindTable`,用于绑定数据库表:
```cpp
bool MyTableModel::bindTable(const QString& tableName)
{
m_query = QSqlQuery(m_db);
if (!m_query.exec(QString("SELECT * FROM %1").arg(tableName))) {
qWarning() << m_query.lastError().text();
return false;
}
m_query.last();
m_rowCount = m_query.at() + 1;
m_columnCount = m_query.record().count();
beginResetModel();
endResetModel();
return true;
}
```
在主程序中,创建一个 QTableView 和 MyTableModel 的实例,并将其绑定到指定的数据库表:
```cpp
QTableView* tableView = new QTableView();
MyTableModel* model = new MyTableModel();
model->bindTable("myTable");
tableView->setModel(model);
```
这样,QTableView 就会显示数据库表中的数据了。注意,这个示例仅仅是一个简单的演示,实际中还需要处理更多的异常情况和错误。