1

我是 Qt 的新手。将从 XML 读取的项目添加到 QTableView 时,我的程序崩溃了。

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Accounts>
<Host>host1</Host>
<Login>dawid1</Login>
<Password>pass1</Password>
<Status>status1</状态>
<Host>host2</Host>
<Login>dawid2</Login>
<Password>pass2</Password>
<Status>status2</Status>
</Accounts>

添加项目代码:

QXmlStreamReader xmlReader;
QAbstractItemModel *model = ui->tableView->model();

xmlReader.setDevice(&file);

while(!xmlReader.atEnd())
{
    QXmlStreamReader::TokenType token = xmlReader.readNext();

    if(token == QXmlStreamReader::StartDocument)
    {
        continue;
    }

    if(token == QXmlStreamReader::StartElement)
    {
        if(xmlReader.name() == "Accounts")
            continue;

        if(xmlReader.name() == "Host")
        {
            model->insertRow(model->rowCount());
            model->setData(model->index(model->rowCount(),0), xmlReader.readElementText()); //probably here crash
        }
        if(xmlReader.name() == "Login")
        {
            model->insertRow(model->rowCount());
            model->setData(model->index(model->rowCount(),1), xmlReader.readElementText());
        }
        if(xmlReader.name() == "Password")
        {
            model->insertRow(model->rowCount());
            model->setData(model->index(model->rowCount(),2), xmlReader.readElementText());
        }
        if(xmlReader.name() == "Status")
        {
            model->insertRow(model->rowCount());
            model->setData(model->index(model->rowCount(),3), xmlReader.readElementText());
        }
    }

    if(xmlReader.hasError())
    {
            QMessageBox::critical(this, "XML Parse Error",xmlReader.errorString(), QMessageBox::Ok);
    }
}
xmlReader.clear();
file.close();

我的问题是:

1. 为什么程序崩溃以及如何修复它?

2. 未来:如何在 QtCreator 中定位崩溃原因并修复它?

问候,大卫

4

1 回答 1

3

至于您的问题编号“2”:您可以在QtCreator中使用调试器运行您的代码:这是第二个类似播放的按钮,上面有一个小错误。这样,当您的应用程序崩溃时,您将知道在哪里。

导致崩溃的行将由行号旁边的箭头指向,您将获得可用的堆栈跟踪和变量值查找。

此外,如果您怀疑代码的哪一部分导致崩溃(或其他意外行为),您可以在它之前放置一个断点。单击行号,应该会出现一个小红球。然后使用调试器运行,您的应用程序将在断点处停止,因此您可以查看变量值,然后逐步跟踪执行。

于 2013-06-07T10:19:34.557 回答