QT C++ 自定义model继承自QAbstractTableModel,并使用setmodel绑定到QTableView,在Qtableview被析构时,自定义model会被析构吗
时间: 2024-04-05 19:32:51 浏览: 24
在Qt中,QTableView和QAbstractTableModel是两个不同的对象,它们之间是通过模型-视图架构进行通信的。因此,当QTableView对象被析构时,并不会影响QAbstractTableModel对象。
在Qt中,当使用setModel()方法将自定义的QAbstractTableModel对象绑定到QTableView对象时,QTableView对象会在内部保存一个指向QAbstractTableModel对象的指针,这个指针并不影响QAbstractTableModel对象的生命周期。因此,当QTableView对象被析构时,只会释放它自己所占用的内存,不会对QAbstractTableModel对象进行析构。
因此,如果你在使用自定义的QAbstractTableModel类时,需要自己确保QAbstractTableModel对象的生命周期,不能在QTableView对象被析构后访问QAbstractTableModel对象,否则会导致未定义的行为。
相关问题
Qt Qtableview 自定义model继承QAbstractTableModel
在Qt中,QTableView是一种用于显示表格数据的控件,而QAbstractTableModel是QTableView使用的一种数据模型。如果想要在QTableView中展示自定义的数据,需要自定义一个继承自QAbstractTableModel的数据模型。
自定义QAbstractTableModel需要实现以下几个方法:
1. rowCount():返回数据模型中的行数。
2. columnCount():返回数据模型中的列数。
3. data():返回某一项的数据,可以用来在QTableView中展示数据。
4. setData():设置某一项的数据,可以用来在QTableView中编辑数据。
5. headerData():返回行或列的标签,可以用来在QTableView中显示表头。
6. flags():返回某一项的标志,用来指定该项是否可编辑、是否可选中等。
自定义QAbstractTableModel类后,可以将其与QTableView关联,通过setModel()方法来设置数据模型,使QTableView显示自定义的数据。
下面是一个简单的自定义QAbstractTableModel的例子:
```c++
class MyTableModel : public QAbstractTableModel
{
public:
MyTableModel(QObject *parent = nullptr);
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;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
private:
QList<QList<QVariant>> m_data;
};
```
在这个例子中,自定义的数据模型类为MyTableModel,其中实现了rowCount()、columnCount()、data()、setData()、headerData()和flags()方法。m_data变量用于存储数据。自定义的数据模型类可以在需要使用表格数据的地方创建,并通过setModel()方法将其与QTableView关联起来。
基于QAbstractTableModel 实现自定义model ,实现数据的增加,删除,修改并更新表格 C++代码
以下是一个基于QAbstractTableModel的自定义model的示例代码,实现了数据的增加、删除、修改和更新表格。
```cpp
// mytablemodel.h
#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H
#include <QAbstractTableModel>
#include <QVector>
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;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
// 自定义方法
bool insertRow(int row, const QModelIndex &parent = QModelIndex());
bool removeRow(int row, const QModelIndex &parent = QModelIndex());
void setTableData(const QVector<QVector<QString>> &data);
private:
QVector<QVector<QString>> m_tableData;
};
#endif // MYTABLEMODEL_H
// mytablemodel.cpp
#include "mytablemodel.h"
MyTableModel::MyTableModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
int MyTableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_tableData.size();
}
int MyTableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
if (m_tableData.isEmpty())
return 0;
return m_tableData[0].size();
}
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole || role == Qt::EditRole) {
int row = index.row();
int column = index.column();
return m_tableData[row][column];
}
return QVariant();
}
bool MyTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole) {
int row = index.row();
int column = index.column();
m_tableData[row][column] = value.toString();
emit dataChanged(index, index, { role });
return true;
}
return false;
}
QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
return QString("Column %1").arg(section);
}
if (orientation == Qt::Vertical && role == Qt::DisplayRole) {
return QString("Row %1").arg(section);
}
return QVariant();
}
Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}
bool MyTableModel::insertRow(int row, const QModelIndex &parent)
{
beginInsertRows(parent, row, row);
QVector<QString> rowData(columnCount());
m_tableData.insert(row, rowData);
endInsertRows();
return true;
}
bool MyTableModel::removeRow(int row, const QModelIndex &parent)
{
beginRemoveRows(parent, row, row);
m_tableData.remove(row);
endRemoveRows();
return true;
}
void MyTableModel::setTableData(const QVector<QVector<QString>> &data)
{
m_tableData = data;
emit layoutChanged();
}
```
使用示例:
```cpp
// main.cpp
#include <QApplication>
#include <QTableView>
#include "mytablemodel.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QVector<QVector<QString>> data = {
{ "1", "Tom", "20" },
{ "2", "Jack", "25" },
{ "3", "Lucy", "18" }
};
MyTableModel model;
model.setTableData(data);
QTableView tableView;
tableView.setModel(&model);
tableView.show();
return a.exec();
}
```
以上代码实现了一个简单的表格,包括三列:编号、姓名和年龄。可以通过调用`insertRow()`、`removeRow()`和`setData()`方法来增加、删除和修改表格中的数据,表格会自动更新。