QAbstractItemModel

liu54ee 2015-09-13 07:02:16

//    QAbstractItemModel::reset();

这个在QT5里面已经移除了,然后搜到一个网页说用下面两条替代
	QAbstractItemModel::beginResetModel();
QAbstractItemModel::endResetModel();

但是我看了官方文档不是直接这么甩两条语句在一起用的
果不其然

请大家说说这两个函数怎么用的?
...全文
740 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
弓人水 2015-09-14
  • 打赏
  • 举报
回复
void GQStats::clear()
{
    beginRemoveRows(QModelIndex(), 0, rowCount());
    for (int i = 0; i < NUM_CATEGORIES; i++)
    {
        _records[i].clear();
        _headers[i].children.clear();
    }
 
    _timer_stack.clear();
    _constant_stack.clear();
 
    _layout_changed = false;
    _data_changed = false;
//    QAbstractItemModel::reset();
    endRemoveRows();
 
}
clear里面不用reset用remove
GreenArrowMan 2015-09-14
  • 打赏
  • 举报
回复
这样吧。
void GQStats::clear()
{
	QAbstractItemModel::beginResetModel();
    for (int i = 0; i < NUM_CATEGORIES; i++)
    {
        _records[i].clear();
        _headers[i].children.clear();
    }

    _timer_stack.clear();
    _constant_stack.clear();

    _layout_changed = false;
    _data_changed = false;
//    QAbstractItemModel::reset();
	QAbstractItemModel::endResetModel();

}
liu54ee 2015-09-14
  • 打赏
  • 举报
回复
引用 2 楼 yaozhiyong110 的回复:
一般是自定义一个子类 然后再修改数据之前 begin 修改之后end
你的意思是自定义QAbstractItemModel子类,然后再这样吗?
void GQStats::clear()
{
	QAbstractItemModel::endResetModel();
    for (int i = 0; i < NUM_CATEGORIES; i++)
    {
        _records[i].clear();
        _headers[i].children.clear();
    }

    _timer_stack.clear();
    _constant_stack.clear();

    _layout_changed = false;
    _data_changed = false;
//    QAbstractItemModel::reset();
	QAbstractItemModel::beginResetModel();

}
但是仍然会出错
liu54ee 2015-09-14
  • 打赏
  • 举报
回复
引用 1 楼 zzs0829 的回复:

{
    beginRemoveRows(QModelIndex(), 0, rowCount());
    qDeleteAll(m_data);
    m_data.clear();
    endRemoveRows();
}
不好意思,我不是很明白,能说清楚一些吗?
yaozhiyong110 2015-09-14
  • 打赏
  • 举报
回复
一般是自定义一个子类 然后再修改数据之前 begin 修改之后end
弓人水 2015-09-14
  • 打赏
  • 举报
回复

{
    beginRemoveRows(QModelIndex(), 0, rowCount());
    qDeleteAll(m_data);
    m_data.clear();
    endRemoveRows();
}
弓人水 2015-09-14
  • 打赏
  • 举报
回复
_records[i].clear(); _headers[i].children.clear(); _timer_stack.clear(); _constant_stack.clear(); 看看是不是这四个中有空指针问题
liu54ee 2015-09-14
  • 打赏
  • 举报
回复
引用 5 楼 u011417605 的回复:
这样吧。
void GQStats::clear()
{
	QAbstractItemModel::beginResetModel();
    for (int i = 0; i < NUM_CATEGORIES; i++)
    {
        _records[i].clear();
        _headers[i].children.clear();
    }

    _timer_stack.clear();
    _constant_stack.clear();

    _layout_changed = false;
    _data_changed = false;
//    QAbstractItemModel::reset();
	QAbstractItemModel::endResetModel();

}
修正了还是一样的问题
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 Qt 官方文档提到支持的类型包括 QStringList、QVariantList、QObjectList 和 QAbstractItemModel。其中,QAbstractItemModel 用于提供复杂的数据模型。以下是一个关于如何将 QAbstractItemModel 与 QML 结合使用的示例说明: 创建 QAbstractItemModel 的子类 首先,需要定义一个继承自 QAbstractItemModel 的类。在这个类中,需要实现模型的基本接口函数,如 rowCount()、columnCount()、data() 和 index() 等。这些函数用于定义数据的结构和访问方式。例如,rowCount() 和 columnCount() 用于指定模型的行数和列数,data() 用于返回特定索引处的数据,index() 用于获取指定位置的索引对象。 在这个自定义模型类中,可以将数据存储在内部数据结构中,如列表、树形结构等,具体取决于数据的复杂性和需求。 在 C++ 中注册模型 在 C++ 代码中,创建自定义模型类的实例,并将其注册到 QML 环境中。这可以通过调用 QQmlContext::setContextProperty() 方法来实现,将模型对象设置为 QML 上下文的属性。这样,QML 文件就可以通过指定的属性名访问该模型。 例如,如果模型对象名为 myModel,则在 QML 中可以通过 myModel 来引用它。 在 QML 中使用模型 在 QML 文件中,可以通过 ListView、TableView 或其他视图组件来展示模型中的数据。通过将视图组件的 model 属性绑定到注册的 QAbstractItemModel 对象,视图组件会自动从模型中获取数

21,434

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧