Ошибка "Driver not loaded" при попытке запроса в функции вызваной QtConcurrent
имеется функция
void doWork(QFutureInterface<void> &future, int flag)
{
QString txt = "вот так и едем";
future.setProgressRange(0, 100);
QSqlQuery q;
if(!q.exec()){
QMessageBox::critical(NULL, "Query error", q.lastError().text().toStdString().c_str());
return;
}
}
головная
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
flagCANCEL = false;
dba = QSqlDatabase::addDatabase("QSQLITE");
dba.setDatabaseName("base.db");
if (!dba.open()) {
QMessageBox::critical(NULL, tr("Ошибка открытия базы"), dba.lastError().text());
exit(1);
}
ui->label->setText(tr(""));
ui->progressBar->setMinimum(0);
ui->progressBar->setValue(0);
ui->progressBar->setRange(0, 100);
QObject::connect(&watcher, SIGNAL(finished()), this, SLOT(finis()));
QObject::connect(&watcher, SIGNAL(canceled()), this, SLOT(abort()));
QObject::connect(&watcher, SIGNAL(progressValueChanged(int)), ui->progressBar, SLOT(setValue(int)));
QObject::connect(&watcher, SIGNAL(progressTextChanged(QString)), ui->label, SLOT(setText(QString)));
connect(ui->aStop, SIGNAL(triggered()), &watcher, SLOT(cancel()));
}
и вызов
void MainWindow::on_aRun_triggered()
{
flagCANCEL = false;
QFuture<void> future = QtConcurrent::run(&doWork, 1);
watcher.setFuture(future);
}
при запросе q.exec выдает ошибку "Driver not loaded". Если вызывать просто, без потока, то все работает нормально. Где копаться?
Ответы (1 шт):
Автор решения: jokerbot
→ Ссылка
Потому, что указатель на бд находится в другом потоке, а QSqlQuery без параметров использует соединение по умолчанию.
https://doc.qt.io/qt-5/threads-modules.html#threads-and-the-sql-module