QMl中使用QAbstractListModel,setdata怎么传递参数QModelIndex

lhappyb 2017-02-27 10:22:35
初学QML,和C++混编遇到一些问题
一个Listview显示数据, 自定义一个QAbstractListModel,需要数据修改所以实现
1.
bool setData(const QModelIndex & index, QVariant value, int role = Qt::DisplayRole);

bool DataListModel::setData(const QModelIndex & index, QVariant value, int role)
{
qDebug() << index;
if (index.isValid() && role == Qt::DisplayRole && !(index.row() >= m_list.size() || index.row() < 0))
{
qDebug() << "2222";
int row = index.row();
Data &data = m_list[row];
switch(index.column())
{
case 0:
data.settype(value.toString());
break;
case 1:
data.setsize(value.toString());
break;
default:
return false;
}
emit dataChanged(index, index);
return true;
}
return false;

}

2.
Qt::ItemFlags flags(const QModelIndex &index)const;

Qt::ItemFlags DataListModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}

现在数据可以显示,可以删除,但修改数据不知道怎么做

1. flags() 函数何时调用,怎么调用
2. setData中的参数QModelIndex在QML怎么传值?

我在QML直接myModel.setData(index,'XXXX',1); },提示错误

请教大家, 谢谢
...全文
1560 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦起丶 2020-05-30
  • 打赏
  • 举报
回复
--- 写一个 Q_INVOKABLE 的set函数,类似于setData(int row, int column, const QVariant &value, int role); 在Qml直接调用即可,在setData实现中(C++中)直接更改底层数据。 ps: 实际上setData() / data() 已经是 Q_INVOKABLE 的,但 QModelIndex 并不能直接在Qml中使用。 --- 整行数据,可以类似上面的set方法,然后根据columnCount自行组装。 --- 如果觉得破坏了MVC,请忽略以上两条(当我没说)。
  • 打赏
  • 举报
回复
第一个问题:flags函数不用自己调用,如果你想自己控制是否可编辑可以使用成员变量控制如下 Qt::ItemFlags DataListModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return 0; } Qt::ItemFlags flags = QAbstractItemModel::flags(index); if(m_blEditData) { flags |= Qt::ItemIsEditable; } return flags; } 第二个问题:QModelIndex 对应你需要编辑的item的index 比如你在点击某一项的时候需要编辑这项数据,那么在点击事件里中会上报你点击项对应的modelindex,你在用这个index去修改数据就可以了
lhappyb 2017-02-27
  • 打赏
  • 举报
回复
有没人帮忙啊
lhappyb 2017-02-27
  • 打赏
  • 举报
回复
有没办法获取整行数据啊
lhappyb 2017-02-27
  • 打赏
  • 举报
回复
使用myModel.index(index, 0)好像可以了
lhappyb 2017-02-27
  • 打赏
  • 举报
回复
引用 2 楼 dell_tx 的回复:
第一个问题:flags函数不用自己调用,如果你想自己控制是否可编辑可以使用成员变量控制如下 Qt::ItemFlags DataListModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return 0; } Qt::ItemFlags flags = QAbstractItemModel::flags(index); if(m_blEditData) { flags |= Qt::ItemIsEditable; } return flags; } 第二个问题:QModelIndex 对应你需要编辑的item的index 比如你在点击某一项的时候需要编辑这项数据,那么在点击事件里中会上报你点击项对应的modelindex,你在用这个index去修改数据就可以了
感谢回复

onClicked: {
          myModel.setData(index,“abc”,0);
 }
我在QML里这样去调用有问题,我打印index的值 显示QModelIndex(-1,-1,0x0,QObject(0x0)),index.isValid()为false了 QModelIndex应该需要的是整行的数据吧?

16,902

社区成员

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

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