将QTreeView添加到QMainWidow-奇怪的行为
使用本教程中的树模型: 此版本有效(显示树): 这一个不起作用:将QTreeView添加到QMainWidow-奇怪的行为,qt,Qt,使用本教程中的树模型: 此版本有效(显示树): 这一个不起作用: int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow mainWin; mainWin.show(); return app.exec(); } class MainWindow: public QMainWindow { QSplitter* splitter; public: M
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误用/未定义的行为 我假设使用“不工作”表示树视图保持为空
您可以在堆栈上创建TreeModel模型。这意味着它将在街区的尽头被摧毁。在第一种情况下,这不是问题,因为main()不会在应用程序退出之前退出(即app.exec()返回)
在第二种情况下,这是一个问题,因为模型将在主窗口构造函数结束时立即销毁,即在窗口甚至可见之前立即销毁。
您必须在堆上创建模型(不要忘记内存管理-将主窗口(this
)作为父窗口传递),或者将其作为成员变量
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);
}
};