Как вернуть простой 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 ответа
В вашем коде есть несколько ошибок. Также вот несколько полезных советов для вашей ситуации:
- Вы уверены, что ваш
model
член был инициализирован / создан? Чтобы проверить это просто сделатьif model!=NULL
проверять. - Вы уверены, что ваш
db
(вPersistenceAdapter::loadServerList()
) был создан экземпляр? _Чтобы проверить это просто сделатьif model!=NULL
проверять. Кроме того, проверьте, был ли этот БД успешно открыт, и проверьте, если онisOpen
в момент использования. Имейте в виду, что вы можете получить некоторые ошибки при выполнении многопоточного доступа к базе данных. - Я не рекомендую создавать
QSqlQuery
вместо этого вы можете использовать другойsetQuery
метод. - После того как вы примените свой запрос, проверьте:
if (model.lastError().isValid()) qDebug() << model.lastError();
- Проверьте порядок вызова ваших функций - если создается экземпляр
db
идет раньше, чем доступdb
и так далее.
Надеюсь, что эти советы пролят свет на. Удачи!
widget.serverListView->setModel(MyModel);
Таким образом, авария может быть только там. Поскольку виджет, кажется, находится в куче (что является плохой идеей), единственная причина сбоя заключается в том, что представление списка серверов не инициализировано должным образом на этом этапе, поэтому это либо нулевой указатель, либо зависание.
Это также выглядит логичным, так как вы, похоже, не инициализируете виджет в конструкторе главного окна. Если вы сделаете это, авария исчезнет.