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

系列文章目录

第一章:(一)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:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

使用PyQt5中的QTableView显示MySQL数据库中的数据,可以通过以下步骤实现: 1. 安装PyMySQL模块: ``` pip install PyMySQL ``` 2. 导入PyQt5和PyMySQL模块: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel import pymysql ``` 3. 创建一个数据库连接: ```python db = QSqlDatabase.addDatabase("QMYSQL") db.setHostName("localhost") # 数据库主机名 db.setPort(3306) # 数据库端口 db.setDatabaseName("test") # 数据库名称 db.setUserName("root") # 数据库用户名 db.setPassword("123456") # 数据库密码 if not db.open(): print("无法连接数据库") sys.exit(-1) ``` 4. 执行SQL查询并将结果显示QTableView中: ```python model = QSqlTableModel() model.setTable("student") # 表名 model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() view = QTableView() view.setModel(model) view.show() ``` 完整代码示例: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel import pymysql if __name__ == '__main__': app = QApplication(sys.argv) db = QSqlDatabase.addDatabase("QMYSQL") db.setHostName("localhost") # 数据库主机名 db.setPort(3306) # 数据库端口 db.setDatabaseName("test") # 数据库名称 db.setUserName("root") # 数据库用户名 db.setPassword("123456") # 数据库密码 if not db.open(): print("无法连接数据库") sys.exit(-1) model = QSqlTableModel() model.setTable("student") # 表名 model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() view = QTableView() view.setModel(model) view.show() sys.exit(app.exec_()) ``` 注意:该代码只是简单地演示了如何使用PyQt5和PyMySQL连接数据库,并将数据显示QTableView中。在实际应用中,需要根据具体需求进行相应的修改和优化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值