yuping
yuping

Reputation: 21

QTreeView no show when placed inside QDockWidget

I want to show a file system using QTreeView on a QDockWidget. The tree will be dynamically changed, so I decided to use QTreeView instead of QTreeWidget.

Here is my code:

QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();

QTreeView w;
w.setModel(&model);
swatch1->setWidget(&w);
w.setEnabled(true);

addDockWidget(leftarea, swatch1);

swatch1 is of type QDockWidget. The above code is inside a function body of type (inherited from) MainWindow. The code runs smoothly, and the tree does not show up.

I also tried another way: putting QTreeView into a QVBoxLayout (using setWidget method), which in turn be put into a QDockWidget (using setLayout method). This 2nd code also runs smoothly, and the tree does not show up.

This code is copied from a working example on Qt Creator IDE, and I tested it working. The only difference is, in the original QTreeView example, the above code is placed inside the main() { ..... } function.

Does anyone has a working example, putting QTreeView into QDockWidget and working (the code actually shows the tree)? Thanks in advance.

Upvotes: 0

Views: 292

Answers (3)

yuping
yuping

Reputation: 21

The problem solved. The original code I wrote by itself is correct, but it is in an object method, and as soon as the execution leaves the object, the tree is destroyed.

So, it is a C++ variable scoping problem, not exactly a Qt problem. I have been using python for a while, and just switch back to C++.

Scheff, thank you for your posting confirmed to me that the Qt code is correct, and suggests to me that something else is wrong.

Upvotes: 0

yuping
yuping

Reputation: 21

Scheff,

Thank you very much for your answer. Sorry I may not be clear about what I am asking: the tree become visible when this code section is in the main() { ....} function:

QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();

QTreeView w;
w.setModel(&model);
w.show();

But the same code (almost same) does not working (program runs but the tree is not visible) when this section of code is in a class function inside MainWindow and QTreeView is added to a QDockWidget:

QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();

QTreeView w;
w.setModel(&model);

swatch1->setWidget(&w);
addDockWidget(leftarea, swatch1);

here, leftarea is a Qt:DockWidgetArea, and swatch1 is an object of type inherited from QDockWidget. when run this program, swatch (a QDockWidget) is visible, but not the tree. still struggling ...

Upvotes: 0

Scheff's Cat
Scheff's Cat

Reputation: 20141

I'm not quite sure what went wrong in the OP. However, I made a minimal complete sample to see whether there are pitfalls:

// standard C++ header:
#include <iostream>
#include <string>

// Qt header:
#include <QApplication>
#include <QDockWidget>
#include <QFileSystemModel>
#include <QMainWindow>
#include <QTreeView>

using namespace std;

int main(int argc, char **argv)
{
  cout << QT_VERSION_STR << endl;
  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  // setup GUI
  QMainWindow qWin;
  QDockWidget qDock;
  qDock.setAllowedAreas(Qt::AllDockWidgetAreas);
  QTreeView qTreeView;
  QFileSystemModel qFSModel;
  qTreeView.setModel(&qFSModel);
  QString path = QDir::currentPath();
  QModelIndex indexPath = qFSModel.index(path);
  qTreeView.scrollTo(indexPath);
  qDock.setWidget(&qTreeView);
  qWin.addDockWidget(Qt::TopDockWidgetArea, &qDock);
  qWin.show();
  // run application
  return qApp.exec();
}

Compiled and tested it with VS2013, Qt 5.6 on Windows 10 (64 bit):

Snapshot of testQDockTreeView

As can be seen in the snapshot, the QTreeView is visible (docked and undocked). I checked that both re-act on mouse clicks - they did.

(I guess this is one of my most minimal Qt applications I ever wrote.)

Upvotes: 2

Related Questions