Как вернуть простой QSqlQueryModel из одного класса в другой?

Я просто хочу обработать базу данных и добавить результат в модель, отправить его в другой класс и просмотреть в графическом интерфейсе. Абстрактный код:

У меня есть участник публичного класса:

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());
}

И ошибка:

БЕГ ЗАВЕРШЕН; Ошибка сегментации; ядро сброшено; в режиме реального времени: 210 мс; пользователь: 10 мс; система: 40 мс

Ценю, если кто-нибудь может помочь.

2 ответа

Решение

В вашем коде есть несколько ошибок. Также вот несколько полезных советов для вашей ситуации:

  1. Вы уверены, что ваш model член был инициализирован / создан? Чтобы проверить это просто сделать if model!=NULLпроверять.
  2. Вы уверены, что ваш dbPersistenceAdapter::loadServerList()) был создан экземпляр? _Чтобы проверить это просто сделатьif model!=NULLпроверять. Кроме того, проверьте, был ли этот БД успешно открыт, и проверьте, если онisOpen в момент использования. Имейте в виду, что вы можете получить некоторые ошибки при выполнении многопоточного доступа к базе данных.
  3. Я не рекомендую создавать QSqlQueryвместо этого вы можете использовать другой setQuery метод.
  4. После того как вы примените свой запрос, проверьте: if (model.lastError().isValid()) qDebug() << model.lastError();
  5. Проверьте порядок вызова ваших функций - если создается экземпляр db идет раньше, чем доступ db и так далее.

Надеюсь, что эти советы пролят свет на. Удачи!

widget.serverListView->setModel(MyModel);

Таким образом, авария может быть только там. Поскольку виджет, кажется, находится в куче (что является плохой идеей), единственная причина сбоя заключается в том, что представление списка серверов не инициализировано должным образом на этом этапе, поэтому это либо нулевой указатель, либо зависание.

Это также выглядит логичным, так как вы, похоже, не инициализируете виджет в конструкторе главного окна. Если вы сделаете это, авария исчезнет.

Другие вопросы по тегам