ubuntu端:使用的是Qt5.10.0
sudo apt-get update
sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev
mysql可视化工具:
sudo apt-get install mysql-workbench
用Qt打开 Qt5.10.0/5.10.0/Src/qtbase/src/plugins/sqldrivers/mysql/mysql.pro项目
修改mysql.pro文件:
修改qsqldriverbase.pri文件:
保存项目。
终端打开到Qt5.10.0/5.10.0/Src/qtbase/src/plugins/sqldrivers目录下,执行命令:
/home/ubuntu/Qt/Qt5.10.0/5.10.0/gcc_64/bin/qmake -- MYSQL_PREFIX=/home/ubuntu/Qt/Qt5.10.0/5.10.0/Src/qtbase/src/plugins/sqldrivers/mysql
cd mysql/
make
此时代表编译成功了。
cd ../plugins/sqldrivers/
即可看到编译成功的qmysql使用的so文件(libqsqlmysql.so libqsqlpsql.so)
将这两个文件拷贝到Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers目录下就可以用了。
Windows端:使用的是Qt5.13.2
1.安装mysql注意事项(mysql-installer-community-5.5.50.0.msi):
(1)注意qt编译的是32位还是64位,需安装对应位数的mysql,
(2)安装目录中不可以有空格,否则编译qmysql时会报错。
2. 安装qt源码,对于qt的版本。
(1)源码目录qt-everywhere-src-5.13.2\qtbase\src\plugins\sqldrivers\mysql,双击mysql.pro文件,进入qt,在mysql.pro中修改如下:
点击构建,即可在生成qsqlmysql库文件存放的位置里看到
这几个文件,其中将dll文件拷贝到Qt5.13.2\5.13.2\mingw73_32\plugins\sqldrivers目录下;在将mysql安装目录lib下的libmysql.dll拷贝到\Qt5.13.2\5.13.2\mingw73_32\bin目录下。
(2)编写mysql测试程序,qt界面:
代码如下:
pro:QT += sql
connection.h
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mydata"); //这里输入你的数据库名 必须在qmysql中存在的
db.setUserName("root");
db.setPassword("root"); //这里输入你的密码
if(!db.open()) {
QMessageBox::critical(0, QObject::tr("无法打开数据库"),
"无法创建数据库连接! ", QMessageBox::Cancel);
return false;
}
//下面来创建表
// 如果 MySQL 数据库中已经存在同名的表, 那么下面的代码不会执行
QSqlQuery query(db);
//使数据库支持中文
query.exec("SET NAMES 'Latin1'");
//创建 course 表
query.exec("create table course(id int primary key, name varchar(20), teacher varchar(20))");
query.exec("insert into course values(0, '数学', '刘老师')");
query.exec("insert into course values(1, '英语', '张老师')");
query.exec("insert into course values(2, '计算机', '李老师')");
return true;
}
#endif // CONNECTION_H
Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSqlTableModel>
#include <QSqlQuery>
#include <QSqlError>
#include <QMessageBox>
class QSqlTableModel;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_submit_pushButton_clicked();
void on_undo_pushButton_clicked();
void on_find_pushButton_clicked();
void on_show_pushButton_clicked();
void on_idUp_pushButton_clicked();
void on_idDown_pushButton_clicked();
void on_del_pushButton_clicked();
void on_add_pushButton_clicked();
private:
Ui::MainWindow *ui;
QSqlTableModel *model;
};
#endif // MAINWINDOW_H
Mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new QSqlTableModel(this);
model->setTable("course");
model->select();
//设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);
}
MainWindow::~MainWindow()
{
delete ui;
}
//提交修改按钮
void MainWindow::on_submit_pushButton_clicked()
{
//开始事务操作
model->database().transaction();
if(model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr("tableModel"), tr("数据库错误: %1").arg(model->lastError().text()));
}
}
//撤销修改按钮
void MainWindow::on_undo_pushButton_clicked()
{
model->revertAll();
}
//查询按钮, 进行筛选
void MainWindow::on_find_pushButton_clicked()
{
QString name = ui->name_lineEdit->text();
if(name.length()){
//根据姓名进行筛选, 一定要使用单引号
model->setFilter(QString("teacher = '%1'").arg(name));
model->select();
}else{
QMessageBox::warning(this, tr("Warning"),tr("姓名不能为空") );
}
}
//显示全表按钮
void MainWindow::on_show_pushButton_clicked()
{
model->setTable("course");
model->select();
}
//按 id 降序排列按钮
void MainWindow::on_idUp_pushButton_clicked()
{
//id 属性, 即第 0 列, 升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
}
//按 id 降序排列按钮
void MainWindow::on_idDown_pushButton_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}
//删除选中行按钮
void MainWindow::on_del_pushButton_clicked()
{
// 获取选中的行
int curRow = ui->tableView->currentIndex().row();
// 删除该行
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr("删除当前行!"), tr("你确定删除当前行吗? "),QMessageBox::Yes, QMessageBox::No);
if(ok == QMessageBox::No)
{ // 如果不删除, 则撤销
model->revertAll();
} else { // 否则提交, 在数据库中删除该行
model->submitAll();
}
}
void MainWindow::on_add_pushButton_clicked()
{
// 获得表的行数
int rowNum = model->rowCount();
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0),rowNum+1);
}
Main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "connection.h"
#include <QStyleFactory> //修改风格1步
#include <QPluginLoader>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setStyle(QStyleFactory::create("fusion"));
if(!createConnection())
return 1;
// QPluginLoader loader;
// // MySQL 驱动插件的路径 绝对路径
// loader.setFileName("Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/libqsqlmysql.so");
// qDebug() << loader.load();
// qDebug() << loader.errorString();
// //显示所有可用的数据库名称
// QStringList drivers = QSqlDatabase::drivers();
// foreach(QString driver, drivers)
// qDebug() << "\t "<< driver;
// qDebug() << "End";
MainWindow w;
w.show();
return a.exec();
}
3.mysql的可视化工具简单使用(mysql-workbench-gpl-5.2.40-win32.msi):
中文乱码问题解决: 在新建数据库时 字体选择为:utf8-utf8-general-ci