【问题标题】:Application crashes when clearing the QTreeWidget清除 QTreeWidget 时应用程序崩溃
【发布时间】:2011-08-26 03:02:25
【问题描述】:

我的应用程序在退出和清除 QTreeWidget 时因 BAD_ACCESS 而崩溃。

这就是我填充树的第一级的方式:

std::set<UrlItem>::iterator i;

for(i = crawler->getUrls()->begin() ; i != crawler->getUrls()->end() ; i++) {
    QList<QString> cells;
    cells.append(i->url);
    cells.append(i->httpStatusMessage);
    cells.append(QString("%1").arg(i->statusCode));

    QTreeWidgetItem *item = new QTreeWidgetItem(ui->resultTreeView, QStringList(cells));

    ui->resultTreeView->addTopLevelItem(item);
}

我认为是标题项导致了崩溃:

ui->resultTreeView->setHeaderItem(new QTreeWidgetItem(ui->resultTreeView, QStringList(headers)));

我在做什么导致这个崩溃?动态分配的项目将树小部件作为其父级,因此只有在树小部件存在时才应将其销毁。

【问题讨论】:

    标签: c++ qt qtreewidget


    【解决方案1】:

    看来我设置标题的方式错误。

    这很好用:

    QList<QString> headers;
    headers.append(tr("Url"));
    headers.append(tr("Message"));
    headers.append(tr("Status code"));
    
    ui->resultTreeView->setHeaderLabels(QStringList(headers));
    

    现在,setHeaderItem 应该做什么以及为什么它会导致我的应用程序崩溃我不知道,但上面的代码达到了预期的效果。

    【讨论】:

    • 您可以使用QStringList headers; headers &lt;&lt; tr("Url") &lt;&lt; ... 插入到标题中,这样您就不需要创建一个临时的QStringList。 (而且 QStringList 实际上只是 QList 的包装器,还有一些更好的重载。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多