【QML】Cmake编译MySql驱动、连接Mysql数据库教程

自Qt5.7以后,Qt官方已经不再提供MySQL驱动,而是转向了MariaDB。但是,对于一些项目,可能还是需要使用MySQL,这时候就需要自己编译MySQL驱动了

当使用Cmake出现如下报错:QSqldatabase: No Such file and directory。这种情况其实是跟CmakeList里面里面添加SQL模块有关,需要在CmakeList里面添加SQL模块。

在Cmake中添加SQL模块

首先打开CmakeList.txt文件,添加如下代码:

1 find_package(Qt NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)
2 find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)

接下来在CmakeList.txt文件中添加如下代码:

注意${PROJECT_NAME}是您的项目名称,请将其替换为您的项目名称。

1 target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
2 target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Sql)

编译MySQL驱动

在完成上述步骤后,如果你没有MYSQL驱动的话,你在编译的时候会在应用程序输出那里看到:

1 QSqlDatabase: QMYSQL driver not loaded
2 QSqlDatabase: available drivers: xxxx

配置MySQL驱动

推荐使用 GitHub 上的预编译版本:

将编译好的qsqlmysql插件复制到Qt的插件目录下。

 

           image

 

/path/to/Qt/plugins/sqldrivers/

在 main.cpp 中添加以下代码检查当前 Qt 支持的数据库驱动:

 

 1 #include <QSqlDatabase>
 2 #include <QDebug>
 3  
 4 int main(int argc, char *argv[])
 5 {
 6     QCoreApplication a(argc, argv);
 7  
 8     qDebug() << "Available drivers:";
 9     const QStringList drivers = QSqlDatabase::drivers();
10     for (const QString &driver : drivers) {
11         qDebug() << driver;
12     }
13  
14     return a.exec();
15 }

 

如果输出中包含 "QMYSQL",说明 Qt 已正确加载 MySQL 驱动:

 

在Qt项目中,使用QSqlDatabase类连接MySQL数据库。

 1 #include <QtSql/QSqlDatabase>
 2 #include <QtSql/QSqlError>
 3 
 4 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
 5 db.setHostName("localhost");
 6 db.setDatabaseName("your_database");
 7 db.setUserName("root");
 8 db.setPassword("your_password");
 9 
10 if (!db.open()) {
11     qDebug() << "Error: " << db.lastError().text();
12     return;
13 }

使用QSqlQueryModel和QSqlTableModel

QSqlQueryModel用于只读模式,QSqlTableModel用于可编辑模式。

1 #include <QtSql/QSqlQueryModel>
2 #include <QtSql/QSqlTableModel>
3 #include <QTableView>
4 
5 QSqlQueryModel *model = new QSqlQueryModel;
6 model->setQuery("SELECT * FROM your_table");
7 QTableView *view = new QTableView;
8 view->setModel(model);
9 view->show();

 

posted @ 2026-01-05 22:02  taohuaxiaochunfeng  阅读(18)  评论(0)    收藏  举报