PDA

View Full Version : QTreeView appears un-ordered and without a scrollbar on startup



karabaja4
12th May 2011, 13:30
Hello,

I have a problem making QTreeView work as expected.

I'm trying to make a simple filesystem tree using QFileSystemModel. I made this to work, but when I start my application, in the first 0.5 - 1 seconds of running the program the tree appears un-ordered (beginning with the home folder) and without a scrollbar. Example pictures are as follows:

This is as it appears on the cold startup for the first 0.5 - 1 seconds:

http://andromeda.kiwilight.com/~dule/upload/example_unsorted.png

This is as it appears after the previous image, that is, after 0.5 - 1 seconds:

http://andromeda.kiwilight.com/~dule/upload/example_sorted.png

My code is as follows:

mainwindow.cpp

#include <QtGui>

#include "mainwindow.h"

MainWindow::MainWindow() {

QString startPath = QDir::currentPath();

// create system models ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~

treeModel = new QFileSystemModel(this);
treeModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
treeModel->setRootPath("/");

// tree ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

treeDock = new QDockWidget("Tree view", this);
treeView = new QTreeView(treeDock);

QWidget* dummyWidget = new QWidget(); //remove dock titlebar
treeDock->setTitleBarWidget(dummyWidget);

treeView->setModel(treeModel);
treeView->setHeaderHidden(true); //no headers
treeView->setUniformRowHeights(false); //better performance
treeView->hideColumn(1);
treeView->hideColumn(2);
treeView->hideColumn(3);
treeView->hideColumn(4);

treeView->setRootIndex(treeModel->index("/"));
treeView->setCurrentIndex(treeModel->index(startPath));
treeView->scrollTo(treeModel->index(startPath));

treeDock->setWidget(treeView); //add tree to dock
this->addDockWidget(Qt::LeftDockWidgetArea, treeDock);

// statusbar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
status = statusBar();

}

(I do need the dock)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include <QtGui>

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow();

private:
QFileSystemModel *treeModel;
QTreeView *treeView;
QDockWidget *treeDock;
QStatusBar *status;
QMenuBar *menuBar;

};

#endif // MAINWINDOW_H


main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}


=> My QTCreator project file: download here (http://andromeda.kiwilight.com/~dule/upload/cccc.tar.gz)

*

=> I forgot to mention the problem (maybe I wasn't clear), I'm trying to eliminate that interval when the tree is un-ordered and without a scrollbar. I want it to appear like in the second picture from the start.

I was going nuts trying to solve this but no luck...
Any help would be greatly appreciated!

wysota
17th May 2011, 02:27
QFileSystemModel fills itself on demand using a worker thread. Thanks to that it doesn't block the application while directories are being scanned. If you want to eliminate this behaviour then either use QDirModel instead of QFileSystemModel or wait until the model is populated before showing it in the tree.

karabaja4
25th May 2011, 01:48
QFileSystemModel fills itself on demand using a worker thread. Thanks to that it doesn't block the application while directories are being scanned. If you want to eliminate this behaviour then either use QDirModel instead of QFileSystemModel or wait until the model is populated before showing it in the tree.

This (the bolded part) is what I want to do, but I have no idea what code to use.

wysota
25th May 2011, 02:20
Don't set the model on the tree until it finishes populating.

Santosh Reddy
25th May 2011, 07:36
Qt Documentation says QDirModel is obsolete.


Don't set the model on the tree until it finishes populating.

directoryLoaded() signal can be used, set the view model in the slot connected to this signal

wschenke
29th May 2014, 10:11
I use a work-around for the described (a little ugly) behaviour.
Derive a class MyTreeView from QTreeView and add the following:

mytreeview.h:


Q_SLOT
void onDirectoryLoaded(const QString&);


mytreeview.cpp:


void YFileTree::onDirectoryLoaded(const QString&)
{
Model->sort(0); // the column for sorting
}

MyTreeView::MyTreeView()
{
// ...
connect(Model,SIGNAL(directoryLoaded(const QString&)),
this,SLOT(onDirectoryLoaded(const QString&)));
// ...
}