qTreeView scrollToBottom()忽略

问题描述 投票:1回答:2

过花了!

我在qTreeView(或QListView)小部件中尝试使用scrollTo()感到很疯狂。为了简化我的问题,我将代码简化为一个简单的scrollToBottom(),我也无法使用。这是mainWindow代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <qfilesystemmodel.h>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFileSystemModel *model = new QFileSystemModel(this);
    QModelIndex modelRootIndex = model->setRootPath(QDir::rootPath());
    ui->treeView->setModel(model);
    ui->treeView->setRootIndex(modelRootIndex);
    ui->treeView->scrollToBottom();
    if(modelRootIndex.isValid()) std::cout << "validIndex" << std::endl;
}

MainWindow::~MainWindow()
{
    delete ui;
}

据我所知,一切正常(我在标准输出中得到了“ ValidIndex”字符串,但该小部件根本不会滚动到底部。

我使用的是Desktop QT5.0.2 msvc2010 32位。

任何想法?谢谢。 L

c++ qt qtreeview
2个回答
0
投票

QFileSystemModelQFileSystemWatcher在单独的线程中保持最新状态。因此,仅在树形视图上设置模型并不能确保在您调用scrollToBottom时将完全填充模型。使用一个小的延迟时间的单次计时器,可以给模型填充时间。

QTimer::singleShot(1000, ui->treeView, SLOT(scrollToBottom()));

另外,(而且我不知道您的应用程序,所以这可能是正确的,也可能不是正确的)。它[[may使您的用户感到困惑,他们需要查看的数据仍然位于视图的底部。您可能会考虑是否可以按照相反的顺序对视图项进行排序(因此,将所需的数据放在顶部),以避免滚动并可能使用法更加直观。


0
投票
这是由于QFileSystemModel工作的异步方式,而Qt中似乎从未修复的错误:https://bugreports.qt.io/browse/QTBUG-9326

您可以在调用QApplication::sendPostedEvents()之前立即执行scrollTo()来解决此问题,但是必须在连接到directoryLoaded信号的函数中调用它们:

MyFileBrowser::MyFileBrowser(QWidget *parent) : QWidget(parent), ui(new Ui::MyFileBrowser) { //... connect(model, SIGNAL(directoryLoaded(QString)), this, SLOT(dirLoaded(QString))); QModelIndex folderIndex = model->index("path/to/dir"); files->setCurrentIndex(folderIndex); files->expand(folderIndex); } void WFileBrowser::dirLoaded(QString dir) { if (dir == model->filePath(files->currentIndex())) { QApplication::sendPostedEvents(); // booyah!! files->scrollTo(files->currentIndex(), QAbstractItemView::PositionAtTop); } }

© www.soinside.com 2019 - 2024. All rights reserved.