QT C++ 自定义model继承自QAbstractTableModel,并使用setmodel绑定到QTableView,在Qtableview被析构时,自定义model会被析构吗
时间: 2024-04-05 22:32:51 浏览: 143
在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关联起来。
写个例子,使用Qt自定义QTableView, 添加列时传入字符串作为id和列绑定
### 使用Qt自定义`QTableView`并添加列时传入字符串作为ID
为了实现这个功能,你可以通过继承 `QAbstractTableModel` 来创建一个自定义的数据模型,并将该数据模型设置到 `QTableView` 中。在这个过程中,我们可以利用字典结构保存每一列对应的 ID 和展示内容。
下面是具体的代码示例:
```cpp
#include <QApplication>
#include <QTableView>
#include <QVBoxLayout>
#include <QWidget>
// 定义表格视图使用的Model类
class CustomTableModel : public QAbstractTableModel {
public:
// 构造函数初始化行数、列数以及每列对应ID的信息
explicit CustomTableModel(QObject *parent = nullptr);
protected slots:
void addColumn(const QString &header, const QVariant& id);
private:
int rowCount(const QModelIndex &) const override;
int columnCount(const QModelIndex &) const override;
QVariant data(const QModelIndex &, int role) const override; // 获取单元格显示的内容
QVariant headerData(int section, Qt::Orientation orientation, int role) const override; // 设置表头信息
QList<QVariant> m_columnIds; // 存储各列关联ID
QStringList m_headers; // 表头文字列表 (如"姓名", "年龄")
};
CustomTableModel::CustomTableModel(QObject *parent)
: QAbstractTableModel(parent),
m_columnIds(),
m_headers() {}
void CustomTableModel::addColumn(const QString &header, const QVariant& id){
beginInsertColumns(QModelIndex(), columnCount()-1, columnCount()); // 插入一列前通知view准备更新UI布局
m_headers << header;
m_columnIds.append(id);
endInsertColumns(); // 告诉view插入结束,触发刷新界面动作
}
int CustomTableModel::rowCount(const QModelIndex&) const{
return 0; // 这里只做演示,暂时没实际行数据可以返回其他值比如5表示有五行记录等...
}
int CustomTableModel::columnCount(const QModelIndex&) const{
return m_headers.size();
}
QVariant CustomTableModel::data(const QModelIndex&, int ) const {
return {}; // 演示用所以直接返回空变体对象,在真实场景需要从m_rows读取相应位置元素填充进来
}
QVariant CustomTableModel::headerData(int section, Qt::Orientation orientation, int role) const {
if(orientation == Qt::Horizontal && role==Qt::DisplayRole){
return m_headers[section];
}
else if (role == Qt::UserRole){ // 用户角色用于传递额外信息给View层处理,默认就是这串文本了。
return m_columnIds[section].toString();// 返回当前section的唯一标识符即ID供外部获取使用
}
return {};
}
// 主窗口构造函数内实例化控件并将它们加入布局管理器中组织起来形成完整用户界面
int main(int argc, char **argv){
QApplication app(argc, argv);
QWidget window;
QVBoxLayout layout(&window);
auto tableView = new QTableView();
auto model = new CustomTableModel(tableView);
tableView->setModel(model);
// 向model增加两列示范性的数据项,“Name”、“Age”
model->addColumn("Name", "col_name");
model->addColumn("Age", "col_age");
layout.addWidget(tableView);
window.show();
return app.exec();
}
```
上面的例子展示了如何构建一个简单的应用程序框架:首先是建立了一个基于 `QAbstractTableModel` 的派生类 `CustomTableModel`, 其内部维护着两个容器分别存储列标题 (`QStringList`) 及其各自的唯一键名 (`QList<QVariant>`), 然后实现了必要的虚成员函数来向外界提供关于自身结构及属性查询的服务;接着我们又编写了一段主程序用来搭建图形化的交互环境并通过调用新添设好的槽方法为表格注入一些初始状态下的字段配置方案 —— 包含“名字”和“年纪”。
阅读全文
相关推荐















