系列文章目录

第一章:(一)QT5.14.2+MSVC2017(32位/64位)+MySQL连接
第二章:(二)QT5.14.2连接MySQL并使用QtableView显示数据表内容


文章目录

  • 系列文章目录
  • 前言
  • 一、使用QSqlDatabase连接MySQL/基本命令
  • 二、QTableView显示数据表内容
  • 三、示例完整代码展示
  • 总结

前言

本文主要讲述了Qt下MySQL数据库的连接及对MySQL数据库进行操作的基本命令,并使用QTableView控件结合QSqlTableModel显示相应数据表的内容,这里写了一个比较简单的示例进行讲解,以便大家学习,如有错误之处,欢迎大家批评指正。

项目效果


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用QSqlDatabase连接MySQL/基本命令

1.定义一个QSqlDatabase对象,设置好连接需要的各个属性(使用命令:mysql -P3307 -h127.0.0.1 -uroot -p123456;)

QSqlDatabase myDb;
myDb = QSqlDatabase::addDatabase("QMYSQL");
myDb.setHostName("localhost");   //本地127.0.0.1
myDb.setPort(3307);   //默认为3306,不需要这一句,我是指定连接
myDb.setDatabaseName("mytestdb");   //设置数据库名,需要一个已经存在的数据库
myDb.setUserName("root");
myDb.setPassword("123456");
if(!myDb.open())
{QMessageBox::warning(this,"Warning",QString("Unable to open database!"));return;
}
else
{qDebug()<<"Connecting to the database successfully!";ui->te_output->appendPlainText("Connecting to the database successfully!");
}

2.使用QSqlQuery对象来执行SQL语句,显示所有数据库(使用命令:show databases;)

QSqlQuery query(myDb);
query.exec("show databases;");

3.显示当前数据库(使用命令:select database();)

QSqlQuery query(myDb);
query.exec("select database();");

4.打开数据库(使用命令:use mytestdb;)

QSqlQuery query(myDb);
query.exec("use mytestdb;");

5.显示当前数据库中的数据表(使用命令:show tables;)

QSqlQuery query(myDb);
query.exec("show tables;");

6.显示数据表内容(使用命令:select *from mytable;)

7.条件查询mytable表中id为1-3的内容(使用命令:select *from mytable where id>=1 and id<=3;)

二、QTableView显示数据表内容

定义一个QSqlTableModel模型绑定数据表,并使用setModel将这个模型绑定到指定的QTableView控件,下列代码会直接在tableView中显示数据表的全部内容

QSqlTableModel *myModel;
myModel = new QSqlTableModel(this);
myModel->setTable(ui->lb_curTable->text());
myModel->select();
myModel->setEditStrategy(QSqlTableModel::OnManualSubmit);   //设置编辑策略为手动提交
ui->tableView->setModel(myModel);
ui->tableView->setModel(myModel);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);   //自动列宽

三、示例完整代码展示

1.main.cpp

#include "widget.h"#include <QApplication>
#include <QStyleFactory>int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyle(QStyleFactory::create("fusion"));   //影响界面表格样式Widget w;w.show();return a.exec();
}

2.widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QSqlError>
#include <QSqlQuery>
#include <QToolTip>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void InitWidget();void setPlainText(QString text);private slots:void doMouseTrackTip(QModelIndex index);void on_pb_connect_clicked();void on_pb_showAllDb_clicked();void on_pb_showCurDb_clicked();void on_pb_openDb_clicked();void on_pb_showTable_clicked();void on_pb_setTable_clicked();void on_pb_showTableData_clicked();void on_pb_commit_clicked();void on_pb_repeal_clicked();void on_pb_record_clicked();void on_pb_remove_clicked();void on_pb_inquire_clicked();void on_pb_display_clicked();private:Ui::Widget *ui;QSqlDatabase myDb;QSqlTableModel *myModel;};
#endif // WIDGET_H

3.widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);InitWidget();
}Widget::~Widget()
{delete ui;
}void Widget::InitWidget()
{//查看数据库驱动//QStringList drivers = QSqlDatabase::drivers();//qDebug()<<drivers;myDb = QSqlDatabase::addDatabase("QMYSQL");myModel = new QSqlTableModel(this);
}void Widget::setPlainText(QString text)
{ui->te_input->clear();ui->te_output->clear();ui->te_input->appendPlainText(text);
}void Widget::doMouseTrackTip(QModelIndex index)
{QToolTip::showText(QCursor::pos(), index.data().toString());
}void Widget::on_pb_connect_clicked()
{QString str = "mysql -P3307 -h127.0.0.1 -uroot -p123456;";setPlainText(str);myDb.setHostName("localhost");   //本地127.0.0.1myDb.setPort(3307);   //默认为3306,不需要这一句,我是指定连接myDb.setDatabaseName("mytestdb");   //设置数据库名,需要一个已经存在的数据库myDb.setUserName("root");myDb.setPassword("123456");if(!myDb.open()){QMessageBox::warning(this,"Warning",QString("Unable to open database!"));return;}else{qDebug()<<"Connecting to the database successfully!";ui->te_output->appendPlainText("Connecting to the database successfully!");}//QSqlQuery query(myDb);//query.exec("create database if not exists database_name;");   //创建数据库//query.exec("drop database if exists database_name;");         //删除数据库//query.exec("drop table if exists table_name");                //删除数据表//创建数据表//query.exec("create table if not exists mytable (id int primary key,name varchar(20),teacher varchar(20))");//query.exec("insert into mytable values(1,'数学','王老师');");   //插入数据//query.exec("insert into mytable values(2,'语文','徐老师');");//query.exec("insert into mytable values(3,'英语','刘老师');");
}void Widget::on_pb_showAllDb_clicked()
{setPlainText("show databases;");QSqlQuery query(myDb);query.exec("show databases;");ui->cb_db->clear();while(query.next()){qDebug()<<"database name:"<<query.value(0).toString();ui->te_output->appendPlainText(query.value(0).toString());ui->cb_db->addItem(query.value(0).toString());}
}void Widget::on_pb_showCurDb_clicked()
{setPlainText("select database();");QSqlQuery query(myDb);query.exec("select database();");while(query.next()){qDebug()<<"database():"<<query.value(0).toString();ui->te_output->appendPlainText(query.value(0).toString());ui->lb_curDb->setText(query.value(0).toString());}
}void Widget::on_pb_openDb_clicked()
{QString useStr = "use " + ui->cb_db->currentText() + ";";setPlainText(useStr + "\nselect database();");QSqlQuery query(myDb);query.exec(useStr);query.exec("select database();");while(query.next()){qDebug()<<"database2():"<<query.value(0).toString();ui->te_output->appendPlainText(query.value(0).toString());ui->lb_curDb->setText(query.value(0).toString());}
}void Widget::on_pb_showTable_clicked()
{setPlainText("show tables;");QSqlQuery query(myDb);query.exec("show tables;");ui->cb_table->clear();while(query.next()){qDebug()<<"table name:"<<query.value(0).toString();ui->te_output->appendPlainText(query.value(0).toString());ui->cb_table->addItem(query.value(0).toString());}
}void Widget::on_pb_setTable_clicked()
{ui->lb_curTable->setText(ui->cb_table->currentText());
}void Widget::on_pb_showTableData_clicked()
{if(ui->lb_curTable->text().isEmpty()){QMessageBox::warning(this,"错误",QString("当前数据表不能为空,请进行选择!"));return;}QString selectStr = "select *from " + ui->lb_curTable->text() + ";";setPlainText(selectStr);myModel->setTable(ui->lb_curTable->text());myModel->select();myModel->setEditStrategy(QSqlTableModel::OnManualSubmit);   //设置编辑策略为手动提交ui->tableView->setModel(myModel);ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);   //自动列宽ui->tableView->setMouseTracking(true); // 设置鼠标追踪,用来显示表格上标签值connect(ui->tableView, &QTableView::entered, this, &Widget::doMouseTrackTip);
}void Widget::on_pb_commit_clicked()
{//开始事务操作myModel->database().transaction();if(myModel->submitAll()){myModel->database().commit();   //提交}else{myModel->database().rollback();   //回滚QMessageBox::warning(this,"tableModel",QString("数据库错误:%1").arg(myModel->lastError().text()));}
}void Widget::on_pb_repeal_clicked()
{myModel->revertAll();
}void Widget::on_pb_record_clicked()
{int rowNum = myModel->rowCount();myModel->insertRow(rowNum);myModel->setData(myModel->index(rowNum,0),rowNum+1);
}void Widget::on_pb_remove_clicked()
{int curRow = ui->tableView->currentIndex().row();myModel->removeRow(curRow);int ok = QMessageBox::warning(this,"删除当前行!","你确定删除当前行吗?",QMessageBox::Yes,QMessageBox::No);if(ok == QMessageBox::No){myModel->revertAll();}else{myModel->submitAll();}
}void Widget::on_pb_inquire_clicked()
{QString idStart = ui->le_idStart->text();QString idEnd = ui->le_idEnd->text();QString whereStr = "id>=" + idStart + " and id<=" + idEnd + ";";if(idStart.length() && idEnd.length()){setPlainText("select *from " + ui->lb_curTable->text() + " where " + whereStr);myModel->setFilter(whereStr);myModel->select();}else{QMessageBox::warning(this,"Warning","id范围不能为空!");}
}void Widget::on_pb_display_clicked()
{myModel->setTable(ui->lb_curTable->text());myModel->select();
}

4.widget.ui


总结

本文讲述了在Qt中连接MySQL数据库以及SQL的一些基本操作命令,并使用了QSqlTableModel模型来绑定数据表数据源,并用QTableView控件来绑定这个模型并将内容显示出来。这里也只是很基础的介绍了这些命令及用法,需要我们学习的还有更多。

上文中该句代码(QStringList drivers = QSqlDatabase::drivers();)可以查看当前Qt存在哪些数据库驱动,我的输出是(“QSQLITE”, “QMYSQL”, “QMYSQL3”, “QODBC”, “QODBC3”, “QPSQL”, “QPSQL7”),其中包含QMYSQL才可以进行MySQL数据库的连接,如果你当前的Qt没有QMySQL驱动,可以查看上一篇文章来进行驱动的安装:QT5.14.2+MSVC2017(32位/64位)+MySQL连接


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

(二)QT5.14.2连接MySQL并使用QtableView显示数据表内容相关推荐

  1. Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,通过Mysql-Front远程连接(开启端口、允许远程连接)

    Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,并能通过Mysql-Front远程连接(开启端口.允许远程连接) 概述: 通过源代码安装高版本的5.6.14. 正文: 一:卸 ...

  2. 当远程连接MySQL数据库的时候显示Can't connect to MySQL server (10060

    当远程连接MySQL数据库的时候显示Can't connect to MySQL server (10060),我们从以下几个方面入手,找出错误的原因: 1.网络不通. 检查能不能ping通. 2.防 ...

  3. JMeter连接mysql数据库,并查找数据

    JMeter连接mysql数据库,并查找数据 连接mysql数据库 数据查找 连接mysql数据库 1.下载mysql的jar驱动,https://mvnrepository.com/artifact ...

  4. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?

    B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...

  5. MySQL 创建数据库和创建数据表

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD. 在这之前,需要先安装好 MySQL ,然后创建好数据库.数据表.操作用户. 一.数据库操作语言 数据库在操作时,需要 ...

  6. MySQL学习笔记_4_MySQL创建数据表(下)

    MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines ...

  7. Java案例:连接SQL Server数据库,显示学生表记录

    Java案例:连接SQL Server数据库,显示学生表记录 演示利用JDBC连接SQL Server数据库,在Java GUI窗口里显示表记录. 一.运行效果 二.实现步骤 1.项目结构图

  8. MySQL(11)--- 删除数据表

    MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...

  9. MySQL创建数据库、创建数据表

    MySQL创建数据库.创建数据表 创建 MySQL 数据库时指定字符集和校对规则 mysql> CREATE DATABASE IF NOT EXISTS test_db_char DEFAUL ...

最新文章

  1. 关于生命、宇宙和万事万物的42个终极问题
  2. 分布式定时任务调度系统技术选型--转
  3. BeetleX轻松搭建HTTP和Weboskcet网关
  4. Android内存泄漏检测利器:LeakCanary
  5. 效果超某度OCR:文本检测、文本识别(cnn+ctc、crnn+ctc)
  6. Cobbler实现自动化安装操作系统
  7. Rust常用编程概念之变量和可变性
  8. BZOJ3172 TJOI2013 单词 AC自动机
  9. net core上传文件异常:Multipart body length limit 16384 exceeded.
  10. 【超图+CESIUM】【基础API使用示例】48、超图|CESIUM - 漫游飞行效果
  11. QT designer安装及运用
  12. IDEA for Mac设置JVM运行参数解决运行卡顿问题
  13. 软件著作权个人申请全套攻略
  14. 数码管动态扫描显示程序内消影流程
  15. 百度有啊前端技术初窥
  16. 克拉克松Clarkson Research情报网注册登录及进行数据查询(以世界造船厂分布为例)
  17. Banner轮播图的基本使用
  18. 后缀树 Suffix Tree
  19. 一加5应用未安装怎么解决_一加手机x安装不了软件下载是什么原因解决方法
  20. iOS UIActivityViewController 实现微信微博等等的分享功能

热门文章

  1. idea project structure下modules的Language Level总是自动变到5
  2. 一文讲透鱼眼相机畸变矫正,及目标检测项目应用
  3. 如何撰写计算机SCI论文的引言部分 - 易智编译EaseEditing
  4. 六行python代码的爱心曲线公式_六行python代码的爱心曲线-Go语言中文社区
  5. 动态规划-- 数组最大不连续递增子序列
  6. stm32 DMA2D使用中断LVGL,提高LVGL帧率
  7. Unity开发VR——结合VRTK(一)
  8. 烟草专卖生产企业许可证
  9. 激光打印机的原理、碳粉分类
  10. 【干货分享|建议收藏】2w字爆肝详解 JavaScript对象