【问题标题】:QSQLITE "Driver not loaded"QSQLITE“未加载驱动程序”
【发布时间】:2021-06-16 18:41:56
【问题描述】:

我对 QSQLDATABASE 有疑问。我正在使用 Qt 4.8.5

我总是收到驱动程序未加载错误。

我已经检查了 QSQLITE 驱动程序是否可用

到目前为止,她是我的代码

article.h

#ifndef ARTICLE_H
#define ARTICLE_H

#include <QWidget>
#include <QtSql>
#include <QSqlDatabase>
namespace Ui {
class article;
}

class article : public QWidget
{
    Q_OBJECT

public:
    explicit article(QWidget *parent = 0);
    ~article();
    void lastId(QString table);
    bool changes();
    void setChanges(bool change);
    bool updates();
    void setUpdates(bool update);


private slots:
    void on_nouveaupushButton_clicked();

private:
    Ui::article *ui;
    bool m_detectChanges;
    bool m_detectUpdates ;
};

#endif // ARTICLE_H

文章.cpp

 #include "article.h"
#include "ui_article.h"
#include <QMessageBox>
#include <databasemananger.h>

article::article(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::article)
{
    ui->setupUi(this);

    m_detectChanges = false ;
    m_detectUpdates = false;

    // Setup
   lastId("articles");
}

article::~article()
{
    delete ui;
}

void article::lastId(QString table)
{

    QSqlDatabase db = QSqlDatabase::database();

    QSqlQuery query ;

    QString queryString = "select seq from sqlite_sequence where name= ? ";

    query.prepare(queryString);

    query.addBindValue("articles");

    if(!query.exec())
    {
        QMessageBox::critical(this,tr("Inventaire"),query.lastError().text());
        return;
    }

    while(query.next())
    {
        ui->articleCodeLineEdit->setText("ART_" + QString::number(query.value(0).toInt() + 1));
        return ;
    }

    if(ui->articleCodeLineEdit->text().isEmpty())
        ui->articleCodeLineEdit->setText("ART_1");





}

bool article::changes()
{
  return m_detectChanges  ;
}

void article::setChanges(bool change)
{
   m_detectChanges = change;
}

bool article::updates()
{
   return m_detectUpdates;
}

void article::setUpdates(bool update)
{
    m_detectUpdates = update ;
}

void article::on_nouveaupushButton_clicked()
{
    // check changes
    // get last id
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <article.h>
#include <QtSql>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_actionAjouter_nouveau_article_triggered();

private:
    Ui::MainWindow *ui;
    QSqlDatabase *m_db ;
    article *m_fenetreArticle;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QtGlobal>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_fenetreArticle = new article(this);
    m_fenetreArticle->setWindowFlags(Qt::Window);
    m_db = new QSqlDatabase;
    // Base de données traitement
    m_db->setHostName("localhost");
    m_db->setDatabaseName("E:/apprendreQt/gestionstock6/database/gestionStock4.db");
    m_db->setPassword("");
    m_db->setUserName("");
    if(!m_db->open())
        QMessageBox::critical(this,"erreur connecting",m_db->lastError().text());



}

MainWindow::~MainWindow()
{
    m_db->close();
    QSqlDatabase::removeDatabase("gestionstock4.db");
    delete ui;
}

void MainWindow::on_actionAjouter_nouveau_article_triggered()
{
   m_fenetreArticle->show();
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

【问题讨论】:

    标签: qt sqlite


    【解决方案1】:

    不要使用m_db = new QSqlDatabase;

    documentation

    QSqlDatabase::QSqlDatabase()

    创建一个空的、无效的 QSqlDatabase 对象。使用 addDatabase()、removeDatabase() 和 database() 获取有效的 QSqlDatabase 对象。

    您在调用addDatabase() 函数时指定要使用的驱动程序:

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    

    【讨论】:

    • 我把我的代码改成这样 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");我得到同样的错误
    【解决方案2】:

    我发现问题是我造成的

    m_fenetreArticle 需要默认的数据库连接,我已经创建 创建默认连接之前的 m_fenetreArticle 对象

    mainwindow.cpp 一定是这样的

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMessageBox>
    #include <QtGlobal>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        m_db = new QSqlDatabase;
        // Base de données traitement
        m_db->setHostName("localhost");
        m_db->setDatabaseName("E:/apprendreQt/gestionstock6/database/gestionStock4.db");
        m_db->setPassword("");
        m_db->setUserName("");
        if(!m_db->open())
            QMessageBox::critical(this,"erreur connecting",m_db->lastError().text());
    
    
     m_fenetreArticle = new article(this);
        m_fenetreArticle->setWindowFlags(Qt::Window);
    
    
    
    }
    
    MainWindow::~MainWindow()
    {
        m_db->close();
        QSqlDatabase::removeDatabase("gestionstock4.db");
        delete ui;
    }
    
    void MainWindow::on_actionAjouter_nouveau_article_triggered()
    {
       m_fenetreArticle->show();
    }
    

    【讨论】:

    • 很好,您已经修复了这个错误,您意识到在创建新的article 对象之前,应该已经创建了默认数据库连接。不过,应该遵循@Leiaz 的建议:不要通过new QSqlDatabase() 创建新的数据库连接。相反,请使用QSqlDatabase::addDatabase(...)
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 2013-11-08
    • 2011-07-06
    • 2016-12-02
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多