1

我只想处理数据库并将结果添加到模型并将其发送到另一个类并在 GUI 中查看它。抽象代码为:

我有一个公共班级成员:

QSqlQueryModel  *model;

加载数据并将其添加到模型并返回模型:

QSqlQueryModel* PersistenceAdapter::loadServerList(){
    cout<<"Loading data"<<endl;
    QSqlQuery* qry = new QSqlQuery(db);
    qry->prepare("select * from student1.SERVERLIST");
    model = new QSqlQueryModel();
    model->setQuery(*qry);
    return model;
}

在其他类中,我有一个加载列表功能。错误来自这里:

void MainWindow::setServersList(QSqlQueryModel *myModel) {
    widget.serverListView->setModel(myModel);
}

然后我从同一个类的构造函数中调用它,这里是代码:

MainWindow::MainWindow() {
    //Stablish connection to database
    PersistenceAdapter *p = new PersistenceAdapter();
    setServersList(p->loadServerList());
}

错误是:

运行完成;分段故障; 核心转储;实时:210ms;用户:10ms;系统:40ms

感谢是否有人可以提供帮助。

4

2 回答 2

1

您的代码中有几个错误。此外,这里有一些针对您的情况的提示和技巧:

  1. 您确定您的model成员已初始化/实例化吗?检查它只是做if model!=NULL检查。
  2. 您确定您的db(in PersistenceAdapter::loadServerList()) 已实例化吗?_检查它只是做if model!=NULL检查。另外,检查该数据库是否已成功打开,并isOpen在使用时检查它是否。请记住,在进行多线程数据库访问时可能会遇到一些错误。
  3. 我不建议创建QSqlQuery,而是可以使用其他setQuery方法
  4. 应用查询后,请检查:if (model.lastError().isValid()) qDebug() << model.lastError();
  5. 检查调用函数的顺序——如果实例化db早于访问db等等。

希望这些提示会有所启发。祝你好运!

于 2014-05-05T10:42:22.133 回答
0

widget.serverListView->setModel(myModel);

所以,崩溃只能在那里。由于小部件似乎在堆上(这是一个坏主意),崩溃的唯一原因是您的服务器列表视图在那个阶段没有正确初始化,所以它要么是空指针,要么是悬空的。

这看起来也很合乎逻辑,因为您似乎没有在主窗口构造函数中初始化小部件的视图。如果你这样做,崩溃就会消失。

于 2014-05-05T10:41:30.697 回答