Evgeny
Evgeny

Reputation: 2161

Adding QTreeView to QMainWidow - strange behavior

Using the TreeModel from this tutorial: http://qt-project.org/doc/qt-4.8/itemviews-simpletreemodel.html

this version works (shows the tree):

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow mainWin;

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

    QTreeView *treeView = new QTreeView(mainWin.splitter);
    treeView->setModel(&model);

    mainWin.show();
    return app.exec();
}

class MainWindow: public QMainWindow {
    QSplitter* splitter;
public:
    MainWindow() : QMainWindow() {
        splitter = new QSplitter(Qt::Horizontal, this);
        splitter->setMinimumSize(1000,1000);
    }
};

and this one doesn't work:

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}

class MainWindow: public QMainWindow {
    QSplitter* splitter;
public:
    MainWindow() : QMainWindow() {
        splitter = new QSplitter(Qt::Horizontal, this);
        splitter->setMinimumSize(1000,1000);

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

        QTreeView *treeView = new QTreeView(splitter);
        treeView->setModel(&model);

    }
};

What happens here? Is there some API misuse / undefined behavior?

Upvotes: 0

Views: 453

Answers (1)

Frank Osterfeld
Frank Osterfeld

Reputation: 25165

I assume that with "doesn't work" you mean that the tree view stays empty.

You create the TreeModel model on the stack. That means it will be destroyed at the end of the block. In the first case, that's not a problem, because main() won't be exited before the application quits (i.e. app.exec() returns).

In the second case it is a problem, as the model will be destroyed right away at the end of the MainWindow constructor, i.e. right away, before the window is even visible. You must create the model either on the heap (don't forget about memory management then - pass the main window (this) as parent) or make it a member variable.

Upvotes: 1

Related Questions