• 21701阅读
  • 16回复

请问如何删除QTableView中选中的行? [复制链接]

上一主题 下一主题
离线wjdid
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-06
我设计了一个Model,将Model中的数据用树的形式显示出来,单击树的某个结点,将此结点的内容显示在QTableView表格中,请问如何实现删除QTableView中当前被选中的行。我用下面的代码删除失败了。
void GHCIPChannelTable::slot_delNode()
{
        QModelIndex curIndex = this->currentIndex();

        if( !curIndex.isValid() )
                return;

        this->model()->removeRow(curIndex.row(),curIndex.parent());
}
因为是QTableView,curIndex.parent()返回的总是一个无效的QModelIndex,请问该如何删除啊,谢谢了!
离线wjdid

只看该作者 1楼 发表于: 2011-04-07
是不是看这个问题太简单了,所以没人回答!请帮帮忙把!
离线davis45
只看该作者 2楼 发表于: 2011-04-07
void SettingDialog::deleteComRow()
{
    int row_fornow = ui.comTableView->currentIndex().row();

    if(comTableModel.removeRow(row_fornow))
    {
        comTableModel.submitAll();
        initializeComTableView();
    }    
}
我不知道为什么你的Index返回无效的,你试试把它注释掉,使用默认的参数
[ 此帖被davis45在2011-04-07 10:41重新编辑 ]
谢谢大家的指教
离线davis45
只看该作者 3楼 发表于: 2011-04-07
QModelIndex QAbstractItemModel::parent ( const QModelIndex & index ) const  [pure virtual]
首先这应该是一个纯虚函数,你有没有重新实现一些你想要的功能呢?还有就是这里面应该接受一个形参的,而且没有默认值,你这样用这个函数,编译器没报错?
谢谢大家的指教
离线wjdid

只看该作者 4楼 发表于: 2011-04-07
我使用默认才参数也试过了,不行。而且我的用法和你的是一样的啊,调用removeRow返回始终是FALSE,不知道为什么一直删除不成功。
离线wjdid

只看该作者 5楼 发表于: 2011-04-07
回 2楼(davis45) 的帖子
void SettingDialog::deleteComRow()
{
    int row_fornow = ui.comTableView->currentIndex().row();

    if(comTableModel.removeRow(row_fornow))
    {
        comTableModel.submitAll();
        initialiseComTableView();
    }    
}
我不知道为什么你的Index返回无效的,你试试把它注释掉,使用默认的参数

不是index是无效的,而是curIndex.parent()返回始终是无效的,因为这是表模型,只有树模型才会有其parent()。
离线davis45
只看该作者 6楼 发表于: 2011-04-07
Re:回 2楼(davis45) 的帖子
引用第5楼wjdid于2011-04-07 10:46发表的 回 2楼(davis45) 的帖子 :
void SettingDialog::deleteComRow()
{
    int row_fornow = ui.comTableView->currentIndex().row();
    if(comTableModel.removeRow(row_fornow))
.......

我把parent函数理解错了,应该是QModelIndex里的函数,你跟一下断点,看看能不能返回给你选择的行号。
谢谢大家的指教
离线wjdid

只看该作者 7楼 发表于: 2011-04-07
回 6楼(davis45) 的帖子
能返回正确的行号,就是执行this->model()->removeRow(curIndex.row())这里时始终不成功,返回的始终是FALSE,很奇怪,我在QTreeView也是这样调用函数删除一行的,就没什么问题。难道QTableView删除一行不能这样用?
离线davis45
只看该作者 8楼 发表于: 2011-04-07
Re:回 6楼(davis45) 的帖子
引用第7楼wjdid于2011-04-07 11:02发表的 回 6楼(davis45) 的帖子 :
能返回正确的行号,就是执行this->model()->removeRow(curIndex.row())这里时始终不成功,返回的始终是FALSE,很奇怪,我在QTreeView也是这样调用函数删除一行的,就没什么问题。难道QTableView删除一行不能这样用?


应该是可以这样用的,你分段试试,this->model()看看能不能返回正确的model,如果能,再继续下面的操作,再看看其他代码段,确定是不是这里出问题的
谢谢大家的指教
离线wjdid

只看该作者 9楼 发表于: 2011-04-07
回 8楼(davis45) 的帖子
QAbstractItemModel * model_ = this->model();
QVariant data_ = model_->data(curIndex);
int row_ = curIndex.row();

this->model()->removeRow(curIndex.row());
我分段查看了上面的数据,全部正确,就是执行到最后一步不成功,返回FALSE,真不明白为什么了!郁闷死了!
[ 此帖被wjdid在2011-04-07 11:34重新编辑 ]
离线wjdid

只看该作者 10楼 发表于: 2011-04-07
汗~~~,我找到问题了,查源码才知道,原来removeRow是调用的removeRows,而removeRows默认返回的FALSE,需要自己从新实现!
离线davis45
只看该作者 11楼 发表于: 2011-04-07
引用第10楼wjdid于2011-04-07 14:33发表的 :
汗~~~,我找到问题了,查源码才知道,原来removeRow是调用的removeRows,而removeRows默认返回的FALSE,需要自己从新实现!

如果你直接写一个类从QAbstractItemModel继承,那才需要重新实现,难道……你是使用的自己写的model?
那你要重新实现了
谢谢大家的指教
离线wjdid

只看该作者 12楼 发表于: 2011-04-07
回 11楼(davis45) 的帖子
我是自己实现的MODEL,现在新问题又来了,在QTreeView显示的树中删除某个节点,能同步删除到QTableView中相应的行,但是当我删除QTableView中某行时,却不能删除相应QTreeView中相应的节点,请问下如何实现两者间的同步?
离线davis45
只看该作者 13楼 发表于: 2011-04-08
回 12楼(wjdid) 的帖子
你是否使用的同一个model?
谢谢大家的指教
离线wjdid

只看该作者 14楼 发表于: 2011-04-08
回 13楼(davis45) 的帖子
是用的同一个MODEL,只是一个用QTreeView在左边显示,当展开昨天树时,讲节点内容用QTableView在右边表格显示出来,但当我在右边表格删除一行时,昨天树中没有删除,怎么做到同步啊?谢谢
离线davis45
只看该作者 15楼 发表于: 2011-04-08
回 14楼(wjdid) 的帖子
听你这么说,感觉不是这么回事啊。
如果你使用的同一个model的话,为什么要树结构中有节点点击后,tableview中才加载model,那这里的tableview用的model与treeview中的model明显不一样啊
谢谢大家的指教
离线wjdid

只看该作者 16楼 发表于: 2011-04-08
回 15楼(davis45) 的帖子
是我说错了,MODEL确实按你说的不一样,是一样的数据。
快速回复
限100 字节
 
上一个 下一个