QTreeView中提供调试断言的QModelIndexList

QTreeView中提供调试断言的QModelIndexList,qt,debugging,assert,qtreeview,qt4.8,Qt,Debugging,Assert,Qtreeview,Qt4.8,在Qt上的一个项目中,我需要从类似文件夹的视图(树状视图)中选择多个项目,并将所选项目填充到另一个小部件中。为了显示多选的可用项,我使用了QTreeView,并填充元素层次结构,如下所示 m_StandardModel = new QStandardItemModel ; QStandardItem *rootNode = m_StandardModel->invisibleRootItem(); //defining a couple of items QStandardItem *i

在Qt上的一个项目中,我需要从类似文件夹的视图(树状视图)中选择多个项目,并将所选项目填充到另一个小部件中。为了显示多选的可用项,我使用了QTreeView,并填充元素层次结构,如下所示

m_StandardModel = new QStandardItemModel ;
QStandardItem *rootNode = m_StandardModel->invisibleRootItem();

//defining a couple of items
QStandardItem *item1 =  new QStandardItem(tr("ITEM1"));
QStandardItem *item2 =  new QStandardItem(tr("ITEM2"));
QStandardItem *item3 =  new QStandardItem(tr("ITEM3"));
QStandardItem *item4 =  new QStandardItem(tr("ITEM4"));

rootNode->appendRow(item1 );
rootNode->appendRow(item2 );
rootNode->appendRow(item3 );
rootNode->appendRow(item4 );

 //register the model
ui->treeView->setModel(m_StandardModel);
ui->treeView->expandAll();

//enabling multiselection behaviour
QItemSelectionModel *selectionModel= ui->treeView->selectionModel();
ui->treeView->setSelectionMode(QAbstractItemView::MultiSelection);
HEAP[myprog.exe]: Invalid address specified to RtlValidateHeap( 00390000, 01946798 )
在这里之前一切都很好。我可以在树状视图中显示我的项目,也可以选择多个项目。当我试图使用树状视图中的多个选定项时,就会出现问题

在我的UI中,我已将按钮的clicked()信号连接到我的插槽,该插槽处理选定项目的迭代和操作。下面是正在调用的函数:

//User selects a number of features listed on the left pane and clicks this button to  disable them
void MainWindow::on_pushButton_2_clicked()
{        
    QModelIndexList selectedItems =  ui->treeView->selectionModel()->selectedIndexes();

    QStringList items;

    foreach(QModelIndex index, selectedItems)
    {
        QStandardItemModel* itemModel = dynamic_cast<QStandardItemModel*>(ui->treeView->model());
        if(itemModel)
        {
            QStandardItem* item = itemModel->itemFromIndex(index);
            items<< item->data().toString();
        }
    }
}
调用堆栈显示,由于销毁了我在函数中创建的本地QModelIndexList,所以达到了此断言

以下是调试断言时的调用堆栈:

你知道我可能错过了什么吗?我试了很多次,但还是没能找出真正的问题。有没有更好的方法来做这里正在做的事情?
我正在使用Qt4.8.4,并且正在Windows 7上的DEBUG配置中构建/调试我的应用程序

我在Windows应用程序中尝试了你的代码,但我看不到你的行为,也许你在程序的其他部分有额外的代码来生成这种行为。我测试的代码如下(我只修改了获取数据的方法,而不是获取显示角色
item->data(Qt::DisplayRole).toString()
):

cpp文件:

#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
m_标准模型=新的QS标准模型;
QStandardItem*rootNode=m_StandardModel->invisibleRootItem();
//定义几个项目
QStandardItem*item1=新QStandardItem(tr(“item1”);
QStandardItem*item2=新QStandardItem(tr(“item2”));
QStandardItem*item3=新QStandardItem(tr(“item3”);
QStandardItem*item4=新QStandardItem(tr(“item4”);
rootNode->appendRow(item1);
rootNode->appendRow(item2);
rootNode->appendRow(item3);
rootNode->appendRow(item4);
//注册模型
ui->treeView->setModel(m_StandardModel);
ui->treeView->expandAll();
//支持多重选举行为
QItemSelectionModel*selectionModel=ui->treeView->selectionModel();
ui->treeView->setSelectionMode(QAbstractItemView::MultiSelection);
连接(用户界面->按钮,信号(点击()),
此插槽(在按钮上单击());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在按钮上单击(){
QModelIndexList selectedItems=ui->treeView->selectionModel()->selectedindex();
QStringList项目;
foreach(QModelIndex索引,selectedItems)
{
QStandardItemModel*itemModel=dynamic_cast(ui->treeView->model());
if(项目模型)
{
QStandardItem*item=itemModel->itemFromIndex(索引);
items数据(Qt::DisplayRole).toString();
}
}
}
头文件:

\ifndef主窗口
#定义主窗口
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
公众时段:
单击按钮时无效();
私人:
Ui::MainWindow*Ui;
QStandardItemModel*m_StandardModel;
};
#endif//main窗口

也许您可以发布孔源代码以查看您的行为。

是否显示完整的
void main window::on_button_2_clicked()
函数?你如何使用物品(QStringList)?请显示完整的代码。@vahancho:函数void main window::on_button_2_clicked()在此处完成。items是一个QStringList,我用它来查看是否选择了正确的值。我在这里简化了实际逻辑。实际上,如果我不使用QModelIndexList,就没有断言!只有在我使用它之后,问题才得以解决。