(二)QT5.14.2连接MySQL并使用QtableView显示数据表内容
系列文章目录
第一章:(一)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显示数据表内容相关推荐
- Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,通过Mysql-Front远程连接(开启端口、允许远程连接)
Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,并能通过Mysql-Front远程连接(开启端口.允许远程连接) 概述: 通过源代码安装高版本的5.6.14. 正文: 一:卸 ...
- 当远程连接MySQL数据库的时候显示Can't connect to MySQL server (10060
当远程连接MySQL数据库的时候显示Can't connect to MySQL server (10060),我们从以下几个方面入手,找出错误的原因: 1.网络不通. 检查能不能ping通. 2.防 ...
- JMeter连接mysql数据库,并查找数据
JMeter连接mysql数据库,并查找数据 连接mysql数据库 数据查找 连接mysql数据库 1.下载mysql的jar驱动,https://mvnrepository.com/artifact ...
- B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?
B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...
- MySQL 创建数据库和创建数据表
MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD. 在这之前,需要先安装好 MySQL ,然后创建好数据库.数据表.操作用户. 一.数据库操作语言 数据库在操作时,需要 ...
- MySQL学习笔记_4_MySQL创建数据表(下)
MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines ...
- Java案例:连接SQL Server数据库,显示学生表记录
Java案例:连接SQL Server数据库,显示学生表记录 演示利用JDBC连接SQL Server数据库,在Java GUI窗口里显示表记录. 一.运行效果 二.实现步骤 1.项目结构图
- MySQL(11)--- 删除数据表
MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...
- MySQL创建数据库、创建数据表
MySQL创建数据库.创建数据表 创建 MySQL 数据库时指定字符集和校对规则 mysql> CREATE DATABASE IF NOT EXISTS test_db_char DEFAUL ...
最新文章
- 关于生命、宇宙和万事万物的42个终极问题
- 分布式定时任务调度系统技术选型--转
- BeetleX轻松搭建HTTP和Weboskcet网关
- Android内存泄漏检测利器:LeakCanary
- 效果超某度OCR:文本检测、文本识别(cnn+ctc、crnn+ctc)
- Cobbler实现自动化安装操作系统
- Rust常用编程概念之变量和可变性
- BZOJ3172 TJOI2013 单词 AC自动机
- net core上传文件异常:Multipart body length limit 16384 exceeded.
- 【超图+CESIUM】【基础API使用示例】48、超图|CESIUM - 漫游飞行效果
- QT designer安装及运用
- IDEA for Mac设置JVM运行参数解决运行卡顿问题
- 软件著作权个人申请全套攻略
- 数码管动态扫描显示程序内消影流程
- 百度有啊前端技术初窥
- 克拉克松Clarkson Research情报网注册登录及进行数据查询(以世界造船厂分布为例)
- Banner轮播图的基本使用
- 后缀树 Suffix Tree
- 一加5应用未安装怎么解决_一加手机x安装不了软件下载是什么原因解决方法
- iOS UIActivityViewController 实现微信微博等等的分享功能
热门文章
- idea project structure下modules的Language Level总是自动变到5
- 一文讲透鱼眼相机畸变矫正,及目标检测项目应用
- 如何撰写计算机SCI论文的引言部分 - 易智编译EaseEditing
- 六行python代码的爱心曲线公式_六行python代码的爱心曲线-Go语言中文社区
- 动态规划-- 数组最大不连续递增子序列
- stm32 DMA2D使用中断LVGL,提高LVGL帧率
- Unity开发VR——结合VRTK(一)
- 烟草专卖生产企业许可证
- 激光打印机的原理、碳粉分类
- 【干货分享|建议收藏】2w字爆肝详解 JavaScript对象