//获取更新之前的所有选中行索引
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来显示您的模型。