模型未反映在QTreeView

时间:2016-08-27 18:32:40

标签: qt

我是QT和C ++的新手,我正在尝试将QTreeView绑定到QStandardItemModel。下面的代码编译,但小部件没有填充childItem。谁知道为什么?

#include <QStandardItemModel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTreeView *qtree = ui->treeView;

    QStandardItemModel model;
    QStandardItem *item = model.invisibleRootItem();
    QStandardItem *childItem = new QStandardItem(QString("child item"));
    item->appendRow(childItem);
    qtree->setModel( &model );

}

2 个答案:

答案 0 :(得分:1)

您创建模型的实例,然后在MainWindow构造函数返回时立即销毁它。你的模型是一个局部变量!

您希望模型成为窗口小部件中的值成员。我还建议忽略愚蠢的Qt Creator模板代码,按指针保持ui成员,但直接按值。额外的指针间接是毫无意义的,过早的悲观化。 15年前,当编译器和磁盘比现在慢1-2个数量级时,这是有道理的。

// mainwindow.h
#include <QMainWindow>
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow {
  Ui::MainWindow ui; // by value!
  QStandardItemModel model; // by value!
public:
  explicit MainWindow(QWidget * parent == nullptr);
  // Let the compiler do the hard work: the default destructor is just fine!
}
// mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget * parent) :
  QMainWindow{parent}
{
  ui.setupUi(this);
  auto root = model.invisibleRootItem();
  root->appendRow(new QStandardItem{QStringLiteral("child item")});
  ui.treeView->setModel(&model);
}

答案 1 :(得分:-1)

我的帖子中的代码不起作用,因为当MainWindow类的构造函数返回时,模型变量被销毁。