1、第一次用QT写东西,在tableview对象后面的函数列表里翻来翻去,找了个看起来顺眼的selectedRows来试图获取选中行的内容,然后插入到list里面。
QList<QModelIndex> list= ui.mould_table->selectionModel()->selectedRows();
qDebug() << list[0].data().toString();
qDebug() << list[1].data().toString();
在取list[0]的值的时候,这很顺利,然鹅当我试图取出list[1]的时候,得到了程序无情的报错,地址越界。
翻阅QT的手册,selectedRows的介绍如下:
“Returns the indexes in the given column for the rows where all columns are selected.”
即取到的是选中行的索引,换句话说,只有被选中行的某一列的的地址,缺省参数是0,也就是首列,所以list里面只插进了一个元素。
2、一个自然的想法是,那我是不是可以直接把选中行的每一列分别插入进list?
QList<QModelIndex> list;
if (!ui.mould_table->selectionModel()->selectedRows().isEmpty())
{
for (int i = 0; i < 9; i++)
{
list[i] = ui.mould_table->selectionModel()->selectedRows(i);
qDebug() << list[i].value(0).data();
}
}
发现还是报错,发现是因为声明的是QModelIndex类型的list,而存多个selectedRows的返回值需要的是QModelIndexList,于是声明处直接改为list[9](我的表共9列),编译通过,可以正常执行。
3、又想了一下,从返回值来看,selectedRows的本意应当是用在选中多行的时候获取选中的到底应该是哪些行,上述操作应该是个邪教用法,而且内存占用似乎也相对大。
变通一番,虽然为了便于管理,我对tableview对象设置的选中策略是每次只能选中单行,但并没必要执着于同时操作整个行,毕竟选中一行就相当于是选中了这行的所有元素,我只要分别取出每个元素就可以了。遂找到了selectedIndexes,手册介绍如下:
Returns a list of all selected model item indexes. The list contains no duplicates, and is not sorted.
很重要的一点是,取出的元素没经过排序,所以插入list的顺序与我的列顺序应当是一致的:
QList<QModelIndex> list = ui.mould_table->selectionModel()->selectedIndexes();
if (!ui.mould_table->selectionModel()->selectedIndexes().isEmpty())
{
qDebug() << sizeof(list);
for (int i = 0; i < 9; i++)
{
qDebug() << list[i].data();
}
}
再做尝试,果然可以。