QTreeView не работает вне основной функции

Я пытаюсь создать простой QTreeView внутри другого виджета (QMainWindow). Следующий код работает должным образом и отображает древовидное представление,

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

  MainWindow w;
  w.show();

  QString rootPath = "C:/";

  QFileSystemModel model;
  model.setRootPath("");

  QTreeView tree;
  tree.setModel(&model);
  if (!rootPath.isEmpty()) {
    const QModelIndex rootIndex = model.index(QDir::cleanPath(rootPath));
    if (rootIndex.isValid())
      tree.setRootIndex(rootIndex);
  }

  tree.setParent(&w);
  tree.show();

  return app.exec();
}

но если я извлеку код, который генерирует древовидное представление, ничего не произойдет. Извлеченная функция выглядит следующим образом:

void create_tree(QMainWindow *w) {
  QString rootPath = "C:/";

  QFileSystemModel model;
  model.setRootPath("");

  QTreeView tree;
  tree.setModel(&model);
  if (!rootPath.isEmpty()) {
    const QModelIndex rootIndex = model.index(QDir::cleanPath(rootPath));
    if (rootIndex.isValid())
      tree.setRootIndex(rootIndex);
  }

  tree.setParent(w);
  tree.show();
}

и соответствующий вызов функции в основной функции выглядит следующим образом:


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

  MainWindow w;
  w.show();

  create_tree(&w);

  return app.exec();
}

Как работает извлеченная функция create_tree и почему она не показывает древовидное представление?


person Omid    schedule 08.06.2020    source источник


Ответы (1)


QFileSystemModel model;

а также

QTreeView tree;

Являются локальными переменными стека, что означает, что они исчезнут после выхода из функции create_tree. Вы можете решить свою проблему, создав их в куче, используя new, что сохранит их жизнь. Будьте осторожны, что вам нужно думать о том, как вы уничтожаете эти созданные объекты. Система родительского контроля Qt очень помогает в этом, потому что родитель уничтожит своих потомков, когда он будет уничтожен, так что ваше древовидное представление в порядке. Вы должны подумать о хорошем родителе для своей модели, чтобы убедиться, что вы не создаете утечки памяти.

Рабочая версия вашей функции выглядит так — будьте осторожны, вам все еще нужно обрабатывать удаление моделей:

void create_tree(QMainWindow *w) {
  QString rootPath = "C:/";

  QFileSystemModel* model = new QFileSystemModel();
  model->setRootPath("");

  QTreeView* tree = new QTreeView();
  tree->setModel(model);
  if (!rootPath.isEmpty()) {
    const QModelIndex rootIndex = model->index(QDir::cleanPath(rootPath));
    if (rootIndex.isValid())
      tree->setRootIndex(rootIndex);
  }

  tree->setParent(w);
  tree->show();
}
person T3 H40    schedule 08.06.2020
comment
Пожалуйста. Я бы порекомендовал вам изучить, как работает родитель Qt. Понимание этой концепции очень поможет вам в разработке Qt. - person T3 H40; 08.06.2020