• 8310阅读
  • 4回复

Model做增加和删除操作后,View不能及时更新问题 [复制链接]

上一主题 下一主题
离线tongxueq
 

只看楼主 倒序阅读 楼主  发表于: 2011-02-14
我在树结点上 插入 一个 QModelIndex
用的更新函数是 ui.modelTreeView->update(newIndex);
但是并没有 立刻更新, 而要鼠标点一下 折叠 ,再展开。就看得到了。
内部数据更新全部正确,
也就是说 只有显示 不能及时更新。

后来 用了很多方法, 比如 更新整棵树
ui.modelTreeView->update(QModelIndex()).  不行
连续调用 ui.modelTreeView->collapse(newIndex), ui.modelTreeView->expand(newIndex),  也不行

有谁碰到过 类似问题,求救!
离线kimtaikee

只看该作者 1楼 发表于: 2011-02-14
你用widget()->update()
或者viewport()->update()
试试看

离线XChinux

只看该作者 2楼 发表于: 2011-02-14
你的model是怎么来的?自定义的吗?是否需要emit dataChanged()?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线atomspace

只看该作者 3楼 发表于: 2011-02-14
试试下面的方式
beginInsertRows()
//插入 一个 QModelIndex
endInsertRows()
离线tongxueq

只看该作者 4楼 发表于: 2011-02-15
我的是 自定义的 模型。 3楼给力。可以 正常显示了。
但是出现了 一个bug. 就是正常更新显示后
如果先操作一个删除操作, 然后在做一个增加操作
这个时候 点击 + 号展开, 程序会 挂掉。
如果去掉 beginInsertRows() ,  endInsertRows(),  beginRemoveRows(), endRemoveRows()
则不会出现该问题。
也就是说,这个新问题是 由于 增加了 这两行代码所致。

下面是我的代码
//这是加结点的代码
    int currentRowCount = this->rowCount(parent);
    QModelItem *parentItem = static_cast<QModelItem*>(parent.internalPointer());
    if(parentItem)
    {
        parentItem->node().appendChild(temp[0]);
        QModelItem *item = parentItem->child(currentRowCount);
        if(item)
        {
            QModelIndex newIndex = this->createIndex(currentRowCount,0,item);
            this->beginInsertRows(newIndex.parent(), currentRowCount, currentRowCount);
            this->insertRow(currentRowCount,newIndex);
            this->endInsertRows();
            return newIndex;
        }
    }
//这是删结点的代码
    QModelItem *item = static_cast<QModelItem*>(index.internalPointer());
    if(item)
    {
        QDomNode node = item->node();
        QDomNode oldNode = node.parentNode().removeChild(node);
        item->parent()->removeChild(index.row());
        if(oldNode.isNull() == false)
        {
            this->beginRemoveRows(index.parent(), index.row(), index.row());
            bool rtn = this->removeRow(index.row(), index);
            this->endRemoveRows();
            return rtn;
        }
    }

所以想诸位 看看,是不是 哪里参数 设置错了。
快速回复
限100 字节
 
上一个 下一个