系列文章目录
第一章:(一)QT5.14.2+MSVC2017(32位/64位)+MySQL连接
第二章:(二)QT5.14.2连接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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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.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!");
}
//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:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。