将QTreeView添加到QMainWidow - 奇怪的行为

时间:2013-12-04 19:57:44

标签: qt

使用本教程中的TreeModel: http://qt-project.org/doc/qt-4.8/itemviews-simpletreemodel.html

此版本有效(显示树):

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);
    }
};

而且这个不起作用:

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);

    }
};

这里发生了什么?是否有一些API滥用/未定义的行为?

1 个答案:

答案 0 :(得分:1)

我认为"不起作用"你的意思是树视图保持空白。

您在堆栈上创建TreeModel模型。这意味着它将在块结束时被销毁。在第一种情况下,这不是问题,因为在应用程序退出之前不会退出main()(即app.exec()返回)。

在第二种情况下,这是一个问题,因为模型将立即在MainWindow构造函数的末尾被破坏,即在窗口甚至可见之前立即销毁。 您必须在堆上创建模型(不要忘记内存管理然后 - 将主窗口(this)作为父窗口传递)或将其设置为成员变量。