如何从一个类返回一个简单的QSqlQueryModel到另一个类

How to return a simple QSqlQueryModel from a class to another class?

本文关键字:一个 QSqlQueryModel 另一个 返回 简单      更新时间:2023-10-16

我只是想在数据库上处理并将结果添加到模型中,并将其发送到另一个类并在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;用户:10 ms;系统:40毫秒

如果有人能帮忙,我很感激。

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

    你确定你的model成员已经初始化/实例化了吗?检查if model!=NULL检查
  1. 你确定你的db(在PersistenceAdapter::loadServerList()中)被实例化了吗?要检查它只需执行if model!=NULL check。另外,检查数据库是否成功打开,并检查它在使用时是否为isOpen。请记住,你可以得到一些错误,而做多线程数据库访问。
  2. 我不建议创建QSqlQuery,相反,您可以使用另一种setQuery方法。
  3. 应用查询后,请检查:if (model.lastError().isValid()) qDebug() << model.lastError();
  4. 检查调用函数的顺序——如果实例化db比访问db更早,等等。

希望这些技巧能对你有所启发。好运!

widget.serverListView -> setModel (myModel);

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

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