zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySql与Qt连接、将数据输出到QT的窗口tableWidget详细过程。

mysqlQt输出连接数据 详细 过程 窗口
2023-09-27 14:19:51 时间


前言

本章节讲为大家讲述,MySql与Qt连接的详细过程及代码框架设计
没有安装MySql的小伙伴可参考一下MySql下载与环境配置、链接放下面了

MySql下载,及安装环境设置

效果实图

图一
在这里插入图片描述
图二
在这里插入图片描述
这里我们要注意一下我们创建的表是student 这里是直接在代码中写死了。
注意记得在服务器中,创建mydata数据库 代码已经写死数据库
“ db.setDatabaseName(“mydata”);//使用哪个数据库”


二、完成Qt与MySql服务的连接需要满足

  • 安装MySql并设置环境
  • 安装Qt并设置适用与MySql的环境
  • 如果Qt报错:QMYSQL driver not loaded
    1、 解决方法是把MySql的 libmysql.dll拷贝到相对应的编译器中
    在这里插入图片描述

2、 注意QT选用的Windows32位要对应32位的 libmysql.dll

3、注意QT选用的Windows64位要对应64位的 libmysql.dll
4、注意:需要在工程文件中的xxxx.pro中添加 QT += sql 如下图所示
5、注意选择C:\mysql-5.7.37-win32\lib中的libmysql.dll拷贝到 C:\Qt\Qt5.9.0\5.9\mingw53_32\bin中 (记得对应是32位还是64位的 一定要对应)libmysql.dll在这里插入图片描述

一、代码框架设计思路

1、QT 2、MySql 3、mydata数据库 4、表 连接MySql成功 对mydata数据库创建表 对表进行添加、更新、删除操作 把表的数据传输到Qt的tableWidget页面 1、QT 2、MySql 3、mydata数据库 4、表

二、开发工具源码

没什么好说的直接拷贝源码到工程中、MinGw编译即可

记得在.pro文件中加入QT += sql

QT       += sql

mainwindow.h 文件源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMainWindow>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QGridLayout>
#include <QTableWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;

public:
   void myLayout();

private  slots:

   void button_1_clicked();
   void button_2_clicked();
   void button_3_clicked();
   void button_4_clicked();
   void button_5_clicked();

protected:
    QLabel  *Label_1;
    QLabel  *Label_2;
    QLabel  *Label_3;
    QLabel  *Label_4;

    QLineEdit *Line_1;
    QLineEdit *Line_2;
    QLineEdit *Line_3;
    QLineEdit *Line_4;

    QPushButton *Button_1;
    QPushButton *Button_2;
    QPushButton *Button_3;
    QPushButton *Button_4;
    QPushButton *Button_5;


    QTableWidget *tableWidget;


    QSqlDatabase db;

};

#endif // MAINWINDOW_H

main.cpp文件源码

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setFixedSize(300,280);
    w.setWindowTitle("MySql连接工具");
    w.myLayout();
    return a.exec();
}

mainwindow.cpp文件源码

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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


void MainWindow::myLayout()
{
    QWidget *centerWindow = new QWidget;
    this->setCentralWidget(centerWindow);

    Button_1 = new QPushButton("连接MySql");
    Button_2 = new QPushButton("添加数据");
    Button_3 = new QPushButton("更新数据");
    Button_4 = new QPushButton("删除数据");
    Button_5 = new QPushButton("显示当前表号数据");


    Line_1 = new QLineEdit;
    Line_2 = new QLineEdit;
    Line_3 = new QLineEdit;
    Line_4 = new QLineEdit;

    Label_1 = new QLabel("id");
    Label_2 = new QLabel("name");
    Label_3 = new QLabel("age");
    Label_4 = new QLabel("score");

    Button_1->setMinimumHeight(50);
    Button_2->setMinimumHeight(50);
    Button_3->setMinimumHeight(50);
    Button_4->setMinimumHeight(50);
    Button_5->setMinimumHeight(50);


    connect(Button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));
    connect(Button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
    connect(Button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
    connect(Button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
    connect(Button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));

    QGridLayout *layout = new QGridLayout;

    layout->addWidget(Line_1,0,1,1,3,Qt::Alignment());
    layout->addWidget(Line_2,1,1,1,3,Qt::Alignment());
    layout->addWidget(Line_3,2,1,1,3,Qt::Alignment());
    layout->addWidget(Line_4,3,1,1,3,Qt::Alignment());

    layout->addWidget(Button_1,4,0,Qt::Alignment());
    layout->addWidget(Button_2,4,1,Qt::Alignment());
    layout->addWidget(Button_3,4,2,Qt::Alignment());
    layout->addWidget(Button_4,4,3,Qt::Alignment());
    layout->addWidget(Button_5,5,0,1,4,Qt::Alignment());


    layout->addWidget(Label_1,0,0,Qt::Alignment());
    layout->addWidget(Label_2,1,0,Qt::Alignment());
    layout->addWidget(Label_3,2,0,Qt::Alignment());
    layout->addWidget(Label_4,3,0,Qt::Alignment());


    layout->setMargin(12);
    centerWindow->setLayout(layout);
}

void MainWindow::button_1_clicked()
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");//数据库服务器ip
    db.setUserName("root");//数据库用户名
    db.setPassword("123456");//数据库密码
    db.setDatabaseName("mydata");//使用哪个数据库
    //端口号就使用默认的3306吧,因为在本地

    if( !db.open() )//打开数据库,如果返回false表示打开失败
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }else
    {
        QMessageBox::warning(this,"恭喜~~~","Mysql连接成功!");
    }

    QSqlQuery query;
    QString sql = "create table student(id int primary key auto_increment,name varchar(255),age int,score int);";
    query.exec(sql);

}

void MainWindow::button_2_clicked()
{
    if(!db.open() )
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }
    int id = Line_1->text().toInt();
    QString name = Line_2->text();
    int age = Line_3->text().toInt();
    int score = Line_4->text().toInt();
    QString sql = QString("insert into student(id,name,age,score) values('%1','%2','%3','%4')").arg(id).arg(name).arg(age).arg(score);
    QSqlQuery query;
    query.exec(sql);

}

void MainWindow::button_3_clicked()
{
    if(!db.open() )
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }

        int id = Line_1->text().toInt();
        QString name = Line_2->text().toUtf8();
        int age = Line_3->text().toInt();
        int score = Line_4->text().toInt();
        QString sql = QString("update student set id='%1',name='%2',age='%3',score='%4' ").arg(id).arg(name).arg(age).arg(score);
        QSqlQuery query;
        query.exec(sql);


}

void MainWindow::button_4_clicked()
{

    if(!db.open() )
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }
        int id = Line_1->text().toInt();
        QString sql = QString("delete from student where id = '%1'").arg(id);
        QSqlQuery query;
        query.exec(sql);


}


void MainWindow::button_5_clicked()
{
    if(!db.open() )
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }
    tableWidget = new QTableWidget(8,4);
    tableWidget->setWindowTitle("mydata surface");
    tableWidget->resize(420, 200);  //设置表格
    QStringList header;
    header<<"id"<<"name"<<"age"<<"score";

    tableWidget->setHorizontalHeaderLabels(header);

    tableWidget->setItem(0,0,new QTableWidgetItem(""));
    tableWidget->setItem(1,0,new QTableWidgetItem(""));
    tableWidget->setItem(2,0,new QTableWidgetItem(""));

    tableWidget->setItem(0,1,new QTableWidgetItem(""));
    tableWidget->setItem(1,1,new QTableWidgetItem(""));
    tableWidget->setItem(2,1,new QTableWidgetItem(""));
    tableWidget->show();





    QString sqlstr="select id,name,age,score from student;";//查询语句
    QSqlQuery query;
    query.prepare(sqlstr);//准备
    int i=0;
    if(query.exec())
    {

    while(query.next())
    {

    tableWidget->setRowCount(i+1);//设置表格行数
    tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
    tableWidget->item(i,0)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
    tableWidget->item(i,1)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
    tableWidget->item(i,2)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,3,new QTableWidgetItem(query.value(3).toString()));
    tableWidget->item(i,3)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);


    i++;
    }

    }
}


源码详解

画窗口内的按钮等 自定义接口 (函数)myLayout 看注释。

void MainWindow::myLayout()
{
    QWidget *centerWindow = new QWidget;  //声明一个QWidget 类 用于连接QGridLayout 画窗口布局
    this->setCentralWidget(centerWindow);

    Button_1 = new QPushButton("连接MySql");   //在头文件中声明一个 QPushButton类的指针 *button_1 然使用new 初始化按钮属性,并建立对象空间。
    Button_2 = new QPushButton("添加数据");   //同上
    Button_3 = new QPushButton("更新数据");	//同上
    Button_4 = new QPushButton("删除数据");	//同上
    Button_5 = new QPushButton("显示当前表号数据"); //同上


    Line_1 = new QLineEdit;    
    Line_2 = new QLineEdit;
    Line_3 = new QLineEdit;
    Line_4 = new QLineEdit;

    Label_1 = new QLabel("id");
    Label_2 = new QLabel("name");
    Label_3 = new QLabel("age");
    Label_4 = new QLabel("score");

    Button_1->setMinimumHeight(50);     //设置按钮的高度
    Button_2->setMinimumHeight(50);
    Button_3->setMinimumHeight(50);
    Button_4->setMinimumHeight(50);
    Button_5->setMinimumHeight(50);


    connect(Button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));  //连接按钮与接口,使其监听到点击按钮信号时,调用,按钮对象里的代码。
    connect(Button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
    connect(Button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
    connect(Button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
    connect(Button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));

    QGridLayout *layout = new QGridLayout;        //声明一个网格布局的QGridLayout类控件 用坐标的形式设计 控件的位置

    layout->addWidget(Line_1,0,1,1,3,Qt::Alignment());  // 0,1,1,3 对应x,y,长,高。
    layout->addWidget(Line_2,1,1,1,3,Qt::Alignment());
    layout->addWidget(Line_3,2,1,1,3,Qt::Alignment());
    layout->addWidget(Line_4,3,1,1,3,Qt::Alignment());

    layout->addWidget(Button_1,4,0,Qt::Alignment());
    layout->addWidget(Button_2,4,1,Qt::Alignment());
    layout->addWidget(Button_3,4,2,Qt::Alignment());
    layout->addWidget(Button_4,4,3,Qt::Alignment());
    layout->addWidget(Button_5,5,0,1,4,Qt::Alignment());


    layout->addWidget(Label_1,0,0,Qt::Alignment());
    layout->addWidget(Label_2,1,0,Qt::Alignment());
    layout->addWidget(Label_3,2,0,Qt::Alignment());
    layout->addWidget(Label_4,3,0,Qt::Alignment());


    layout->setMargin(12);
    centerWindow->setLayout(layout);
}

接口按钮button_1_clicked() 详解 看注释

void MainWindow::button_1_clicked()
{


    QSqlDatabase db;    //QSqlDatabase类处理与数据库的连接,要使用这个类,头文件需要导入QSqlDatabase库:
    db = QSqlDatabase::addDatabase("QMYSQL");    //设置QSqlDatabase 类型 的db 用于设置连接数据库的参数
    db.setHostName("127.0.0.1");//数据库服务器ip
    db.setUserName("root");//数据库用户名
    db.setPassword("123456");//数据库密码
    db.setDatabaseName("mydata");//使用哪个数据库
    //端口号就使用默认的3306吧,因为在本地
	db.setPort(3306);  //设置连接端口
    if( !db.open() )//打开数据库,如果返回false表示打开失败
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }else
    {
        QMessageBox::warning(this,"恭喜~~~","Mysql连接成功!");
    }

    QSqlQuery query;  //QSqlQuery类提供了一个用于执行SQL语句和浏览查询的结果集的接口。
    QString sql = "create table student(id int primary key auto_increment,name varchar(255),age int,score int);";   //建立一个QString 型字符串,用于存储MYSQL的命令
    query.exec(sql); //使用接口调用命令

画表格类控件QTableWidget类接口函数 button_5_clicked() 详解,看注释

void MainWindow::button_5_clicked()
{
    if(!db.open() )      //检测服务器是否打开,在工程中,我使用的是全局变量,用于监测服务器是否打开的状态
    {
        QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
        return;
    }
    tableWidget = new QTableWidget(8,4);    //初始化 tableWidget  设置表格8行4列
    tableWidget->setWindowTitle("mydata surface");
    tableWidget->resize(420, 200);  //设置表格
    QStringList header;
    header<<"id"<<"name"<<"age"<<"score";

    tableWidget->setHorizontalHeaderLabels(header);

    tableWidget->setItem(0,0,new QTableWidgetItem(""));  //初始化表
    tableWidget->setItem(1,0,new QTableWidgetItem(""));	
    tableWidget->setItem(2,0,new QTableWidgetItem(""));

    tableWidget->setItem(0,1,new QTableWidgetItem(""));
    tableWidget->setItem(1,1,new QTableWidgetItem(""));
    tableWidget->setItem(2,1,new QTableWidgetItem(""));
    tableWidget->show();  //使其通过打开一个窗口打开表





    QString sqlstr="select id,name,age,score from student;";//使用MYSQL查询语句获取表的数据 ,写入tableWidget中
    QSqlQuery query;
    query.prepare(sqlstr);//准备
    int i=0;
    if(query.exec())
    {

    while(query.next())
    {

    tableWidget->setRowCount(i+1);//设置表格行数,每一次加一行
    tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString())); //将从数据库中表获取的数据写入到tableWidget 表中
    tableWidget->item(i,0)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
    tableWidget->item(i,1)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
    tableWidget->item(i,2)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);

    tableWidget->setItem(i,3,new QTableWidgetItem(query.value(3).toString()));
    tableWidget->item(i,3)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);


    i++;
    }

    }
}

心得

框架设计,使用myLayout 画出控件的位置并展现到窗口中,使用QLineEdit,获取数据,通过点击按钮调用按钮对象,通过MYSQL语句命令写入到数据库表内,整个app工具设置,采用纯代码形式,方便WIndow与Ubuntu操作系统代码移植方便。