Qt QItemSelectionModel::setCurrentIndex无法打开

Qt QItemSelectionModel::setCurrentIndex无法打开,qt,qtreeview,Qt,Qtreeview,我的代码: void TreeModel::selectIndex(QModelIndex ix) { if (!ix.isValid()) return; qDebug() << "name1" << ix.data(); tree->selectionModel()->clear(); tree->setExpanded(ix.parent(), true); tree->selectionModel()->setCu

我的代码:

void TreeModel::selectIndex(QModelIndex ix) {
  if (!ix.isValid()) return;
  qDebug() << "name1" << ix.data();
  tree->selectionModel()->clear();
  tree->setExpanded(ix.parent(), true);
  tree->selectionModel()->setCurrentIndex(ix, QItemSelectionModel::SelectCurrent);
  tree->scrollTo(ix);
}
不带tree->selectionModel->setCurrentIndexix,QItemSelectionModel::SelectCurrent;效果很好,但我确实需要选择此项

提前非常感谢

调试器日志:

>~"\nProgram received signal "
>~"SIGSEGV, Segmentation fault.\n"
>~"0x00438290 in QVariant::Private::Private (this="
>&"warning: (Internal error: pc 0x0 in read in psymtab, but not in symtab.)\n"
 (Internal error: pc 0x0 in read in psymtab, but not in symtab.)
>&"\n"
>~"0x0) at ../../../../../../Qt/Qt5.0.2/5.0.2/mingw47_32/include/QtCore/qvariant.h:367\n"
>~"367\t        inline Private(): type(Invalid), is_shared(false), is_null(true)\n"

>~"data=[{iname=\"local.node\",name=\"node\",addr=\"0x14384220\",addr=\"0x14384220\",numchild=\"9\",origaddr=\"0x28d86c\",type=\"DNode\",value=\"{...}\",},{iname=\"local.this\",name=\"this\",addr=\"0x14341820\",addr=\"0x14341820\",numchild=\"5\",origaddr=\"0x28d890\",type=\"TreeModel\",value=\"{...}\",},{iname=\"local.index\",name=\"index\",addr=\"0x28dba8\",numchild=\"0\",type=\"QModelIndex &\",value=\"(invalid)\",},{iname=\"local.role\",name=\"role\",addr=\"0x28d898\",numchild=\"0\",type=\"int\",value=\"1\",},],typeinfo=[{name=\"aW50\",size=\"4\"}{name=\"Y29uc3QgUU1vZGVsSW5kZXggJg==\",size=\"4\"}{name=\"RE5vZGUgKg==\",size=\"4\"}{name=\"RE5vZGU=\",size=\"36\"}]\n"
>2390^done
dDISCARDING JUNK AT BEGIN OF RESPONSE: 
dProgram received signal SIGSEGV, Segmentation fault.
d0x00438290 in QVariant::Private::Private (this=0x0) at ../../../../../../Qt/Qt5.0.2/5.0.2/mingw47_32/include/QtCore/qvariant.h:367
d367            inline Private(): type(Invalid), is_shared(false), is_null(true)
 <Rebuild Watchmodel 243>
sFinished retrieving data
tree->selectionModel是否返回非空指针

您如何在应用程序重新启动时记住所选项目

对于模型的客户端来说,在模型结构更改后使用模型保留QModelIndex的任何操作都是错误的。结构更改是在模型中添加或删除项的任何更改。isValid方法未检测到此问题。考虑模型索引,就像标准C++库迭代器一样,当从容器中添加/删除项时,它们也会变得无效。 我不知道您是如何实现您的模型的,但是如果您对任何标准的Qt模型进行子类化/重用,这个限制也适用于您自己对索引的使用

经受住结构变化的指数称为持久性指数。如果需要这些功能,您应该使用它们


这是一个Qt错误。唯一的出路是:

void MainWindow::showEvent(QShowEvent *event) {
  QMainWindow::showEvent(event);
  QTimer::singleShot(0, this, SLOT(selectLastNode()));
}

它到底在哪里坠毁?在调试器中运行它。在setCurrentIndex中,如果不使用它,它将起作用。我确实使用调试器。如果你运行调试器,那么向我们显示回溯。它会给出消息,劣质停止,因为它从操作系统接收到信号。SIGSEGV…那不是回溯。回溯将精确显示崩溃发生在Qt的源代码的哪一行。我知道这是一篇老文章,但是你能提供QTBUG的链接吗?
void MainWindow::showEvent(QShowEvent *event) {
  QMainWindow::showEvent(event);
  QTimer::singleShot(0, this, SLOT(selectLastNode()));
}