在使用QTreeView展示数据的时候,有些数据是在动态变化的,
这时候也需要动态刷新界面,一般直接更新model即可。
但是存在一个问题:之前的选中状态会丢失。
本文讨论在更新数据时如何处理选中状态。

2,两种情况

情况一:更新数据后,需选中同样 内容 的行。
比如:之前有3行,每行内容为a/b/c,选中了第1行a。现在更新后有5行,x/y/a/b/c,更新后要求仍然选中a,即第3行。
适用情况:软件其他地方与QTreeView里的选中内容有对应关系。所以这个选中行的具体内容不能变,不然无法对应。
解决办法:记录选中行的可唯一识别的data,在刷新后逐行判断,在记录内的就选中。

情况二:更新数据后,需选中同样 位置 的行。
比如:之前有3行,每行内容为a/b/c,选中了第1行a。现在更新后有5行,x/y/a/b/c,更新后要求仍然选中第1行,即x。
解决办法:记录选中行的index,刷新后设置该index即可,如果刷新后的数据不存在该index那么设置会失败,不用管。

对于情况二,存储每行index,然后设置index。
示例代码:

		//获取更新之前的所有选中行索引
		QModelIndexList selected = ui->treeView->selectionModel()->selectedIndexes();
		//清除所有行
        mModel->removeRows(0,mModel->rowCount());
        //更新数据
        InitTreeModel();
		//重设索引为之前的位置
        if(!selected.isEmpty())
            foreach(const QModelIndex& index, selected)
                ui->treeView->selectionModel()->select(index,QItemSelectionModel::Select | QItemSelectionModel::Rows);

对于情况一,存储每行一个具体的key值。然后在更新数据后遍历每行比较key值,存在就加入新的选中索引。
代码类似,可自行实现。

1,简介在使用QTreeView展示数据的时候,有些数据是在动态变化的, 这时候也需要动态刷新界面,一般直接更新model即可。 但是存在一个问题:之前的选中状态会丢失。 本文讨论在更新数据时如何处理选中状态。2,两种情况情况一:更新数据后,需选中同样内容的行。 比如:之前有3行,每行内容为a/b/c,选中了第1行a。现在更新后有5行,x/y/a/b/c,更新后要求仍然选中...
背景:最近用到了treeView控件,来显示指定文件夹里的所有文件,文件因为有更新,因此实现了一个右键菜单点击刷新表的功能。 本来以为这个功能很简单,只需要把原来的treeview或者model删除了,重新加载一次就好了,也看到有网友提供这样类似的方法,但是自己尝试了多次都没有实现,清空model->clear()后,程序直接崩溃,貌似原因是这样做了model将不能再次被使用。。。在网上看了很多资料,都没有找到一种合适的解决办法。 解决办法:最终自己只能用笨方法解决了。思路:遍历文件夹中的文件与tr
如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习。 我开始使用的QTreeWidget 控件来显示我的数据,发现该控件在显示10000以下的数据还可以应付的过来,但超过10000条,就明显感觉到屏幕刷新就会有卡的现象,而且占据内存很大,虽然操作起来简单
QTreeView处理大量数据使用1000万条数据,每次都只是部分刷新) 如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习。 我开始使用的QTreeWidget 控件来显示我的数据,发现该控件在显示10000以下的数据还可以应付的过来,但超过100...
问题:调用QStandarditemmodel中的setData,然后emit了dataChanged信号,tableview不能时时更新 原因:多线程:在另外一个线程中直接更新model的值会有问题,view不能实时刷新 解决方案:信号和槽:在更新数据线程发射一个信号到界面线程,由界面线程更新界面。
最近开发redis可视化ui,连到了阿里云上的redis,这个redis的hash动辄好几百条数据,拿到后写到QTableview中。测试良好。 但测试一段时间后,点了几十条hash,拿到了几十条hash数据,QTableview也更新了几十次,在进其他操作的时候,出现了程序崩溃。 于是就想,是不是发生了内存泄漏。 假设有一个QTableview,名叫table 先看下面的代码,功能是清空TableView void clearTreeView(){ ui->view->setM
您可以通过继承QTreeView并重写其paintEvent函数来实现该功能。以下是一个简单的实现示例,它将当前选中及下面8的字体颜色更改为蓝色: ```cpp class BlueTreeView : public QTreeView { public: explicit BlueTreeView(QWidget* parent = nullptr) : QTreeView(parent) {} protected: void paintEvent(QPaintEvent* event) override { QTreeView::paintEvent(event); // 先调用父类的paintEvent函数 QPainter painter(viewport()); painter.setFont(font()); // 使用相同的字体 QModelIndex currentIndex = currentIndex(); // 获取当前选中的索引 int selectedRow = currentIndex.row(); // 更改当前选中及下面8的字体颜色为蓝色 for (int i = selectedRow; i <= selectedRow + 8; ++i) { QModelIndex index = model()->index(i, 0, currentIndex.parent()); if (index.isValid()) { QStyleOptionViewItem option = viewOptions(); option.state |= QStyle::State_Selected; option.state |= QStyle::State_Active; option.rect = visualRect(index); if (currentIndex == index) { painter.setPen(QColor(Qt::blue)); } else { painter.setPen(QColor(Qt::black)); itemDelegate()->paint(&painter, option, index); 然后,您可以使用BlueTreeView代替QTreeView来显示您的模型。