2014-02-16 15 views
1

我的代碼:QItemSelectionModel :: setCurrentIndex不會對開放工作

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

這段代碼運行刪除/插入節點後確定。但是,當我嘗試選擇從QMainWindow的前一交易日的記憶節點:: showEvent結果是:

name1 QVariant(QString, "Highlight elements") 
The program has unexpectedly finished. 
C:\Home\develop\qt\arm\designer\Designer exited with code -1073741819 

沒有tree->selectionModel()->setCurrentIndex(ix, 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 
+0

它究竟在哪裏崩潰?在調試器中運行它。沒有它的setCurrentIndex中的 –

+0

。我確實使用調試器。 – eugene

+0

如果您運行調試器,然後向我們顯示回溯。 –

回答

1

這是一個Qt錯誤。唯一的出路:

void MainWindow::showEvent(QShowEvent *event) { 
    QMainWindow::showEvent(event); 
    QTimer::singleShot(0, this, SLOT(selectLastNode())); 
} 
0
  1. 是否tree->selectionModel()返回一個非空指針?

  2. 如何在應用程序重新啓動時「記住」所選項目?

  3. 它始終是一個模型的客戶端(任何使用的模型)模型的結構後保留一個QModelIndex錯誤而改變。結構更改是添加或刪除模型中項目的任何更改。 isValid方法確實不是檢測到此問題。像標準C++庫迭代器那樣思考模型索引 - 當您從容器中添加/刪除項目時,它們也會變得無效。

    我不知道你是如何實現你的模型,但如果你繼承/重用任何標準的Qt模型,這個限制也適用於你自己使用的索引。

    經歷結構性變化的指數稱爲持續指數。如果你需要這樣的功能,你應該使用它們。