Ошибка "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

→ Ссылка