添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、操作示例

1.1 修改记录(数据)

下图含手动更新记录和自动更新记录时的记录修改操作,其中前十秒是自动更新记录的操作,后十秒为手动更新记录的操作(当非自动保存时,不点击保存按钮就不会保存)。
在这里插入图片描述

1.2 添加记录(数据)

下图为添加记录的操作,新添加的记录行的行标题是‘*’符号,并且当更新策略为手动更新时,需要手动保存记录。
在这里插入图片描述

1.3 删除记录(数据)

下图为删除记录的操作,删除后行的行标题变为‘!’,并且删除操作不区分自动/手动提交记录,无论怎样都是自动提交。
在这里插入图片描述

1.4 取消操作

下图为取消操作,点击取消按钮后,之前修改/添加的数据将会恢复到最开始的样子(除了删除操作)。
在这里插入图片描述

1.5 排序操作

下图为排序操作,分别演示了id(字符类型)和age(数值类型)的排序效果。
在这里插入图片描述

1.6 查询操作

下图为查询操作,演示了查询id为001 和 name“小王”的信息,以及当前文本为“查询字段”时,点击查询则清空查询条件,
在这里插入图片描述
提示:示例图中开始都先刷新了数据表,表明数据为最新数据;源码在本文第三节(源码含详细注释);
不会使用Qt设计师设计界面的小伙伴点击这里

二、了解QSqlTableModel

  1. 因为是sql操作,所以需要在pro文件添加“QT += sql”;
  2. 虽然QSqlTableModel继承自QSqlQueryModel类,但其灵活性比QSqlQueryModel要多很多。
  3. QSqlTableModel能对数据进行操作,并且操作QSqlTableModel对象中的数据,将会对对应的数据表进行修改;
  4. QSqlTableModel具有识别字段类型的功能,从而提供不同的代理控件(如示例图中的年龄和身高控件为spinBox控件)。

提示:源码中的槽函数都是通过ui文件的转到槽功能添加,所有没有连接信号槽的代码

3.1 CSqlTest.h

#ifndef CSQLTEST_H
#define CSQLTEST_H
#include <QMainWindow>
#include <QSqlTableModel>
namespace Ui {
class CSqlTest;
class CSqlTest : public QMainWindow
    Q_OBJECT
public:
    explicit CSqlTest(QWidget *parent = 0);
    ~CSqlTest();
private slots:
    void on_addBt_clicked();    //添加
    void on_deleteBt_clicked(); //删除
    void on_saveBt_clicked();   //保存(手动保存数据时可用)
    void on_cancelBt_clicked(); //取消(手动保存数据时可用)
    void on_autoSaveCheckBox_clicked(bool checked); //是否自动保存数据的复选框
    void on_tableView_clicked(const QModelIndex &index);    //获取当前点击行号的槽函数
    void on_sortFunction(); //排序槽函数
    void on_findBt_clicked();   //查询槽函数
private:
    Ui::CSqlTest *ui;
    QSqlTableModel  *m_pModel;      //数据模型对象
    QSqlDatabase    m_db;           //数据库对象
    int             m_lastClickRow; //最后点击行的行号变量
#endif // CSQLTEST_H

3.2 CSqlTest.cpp

#include "CSqlTest.h"
#include "ui_CSqlTest.h"
#include <QDebug>
#include <QSqlError>
CSqlTest::CSqlTest(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CSqlTest)
    , m_lastClickRow(0)
    ui->setupUi(this);
    this->setWindowTitle("QSqlTableModel测试");
    //连接排序的信号槽
    connect(ui->sortComboBox, &QComboBox::currentTextChanged, this, &CSqlTest::on_sortFunction);
    connect(ui->ascRadioButton, &QRadioButton::clicked, this, &CSqlTest::on_sortFunction);
    connect(ui->descRadioButton, &QRadioButton::clicked, this, &CSqlTest::on_sortFunction);
//-----------------------连接数据库-----------------------
    //指定数据库类型
    m_db = QSqlDatabase::addDatabase("QMYSQL");
    //设置主机名、用户名、密码、端口号等信息(若是使用SQLite数据库这些信息无需设置,仅指定数据库名即可)
    m_db.setHostName("127.0.0.1");
    m_db.setUserName("root");
    m_db.setPassword("123456");
    m_db.setPort(3306);
    //指定数据库名
    m_db.setDatabaseName("test");
    if(!m_db.open())
        qDebug() << "打开数据库失败!" << m_db.lastError().text();
                    return;
//-----------------------QSqlTableModel-----------------------
    //为数据模型设置父对象、数据库对象
    m_pModel = new QSqlTableModel(this, m_db);
    //指定数据源表
    m_pModel->setTable("StudentsInfo");
    //指定排序字段及排序方式
    m_pModel->setSort(0, Qt::AscendingOrder);
    //设置数据更新模式(行/列某值更新时hi立即更新到数据库)
    //! QSqlTableModel::OnFieldChange 字段值变化时立即更新到数据库中
    //! QSqlTableModel::OnRowChange 当前行变化时才将修改值更新到数据库中
    //! QSqlTableModel::OnManualSubmit 修改是数据暂存,需要手动提交
    m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    if(!m_pModel->select())
        qDebug() << "数据查询失败!!" << m_pModel->lastError().text();
        return;
    //设置数据模型指定列的列标题(若是不设置,则标题为和数据表上一样)
    m_pModel->setHeaderData(0, Qt::Horizontal, "学号");
    m_pModel->setHeaderData(1, Qt::Horizontal, "姓名");
    m_pModel->setHeaderData(2, Qt::Horizontal, "年龄");
    m_pModel->setHeaderData(3, Qt::Horizontal, "身高");
    //将数据模型设置到tableView控件上
    ui->tableView->setModel(m_pModel);
CSqlTest::~CSqlTest()
    delete ui;
void CSqlTest::on_addBt_clicked()
    //无名字时将不能添加
    if(ui->nameEdit->text().isEmpty())
        return;
    //添加新行到m_lastClickRow值的位置
    m_pModel->insertRow(m_lastClickRow);
    //计算、获取新建记录上的值并设置
    QString sid =  QString("%1").arg(m_pModel->rowCount(), 3, 10, QLatin1Char('0'));
    m_pModel->setData(m_pModel->index(m_lastClickRow, 0), sid);
    m_pModel->setData(m_pModel->index(m_lastClickRow, 1), ui->nameEdit->text());
    m_pModel->setData(m_pModel->index(m_lastClickRow, 2), ui->ageSpinBox->text());
    m_pModel->setData(m_pModel->index(m_lastClickRow, 3), ui->heightSpinBox->text());
void CSqlTest::on_deleteBt_clicked()
    //没有记录时,将不能删除
    if(m_pModel->rowCount() == 0)
        return;
    //移除最后点击的行
    m_pModel->removeRow(m_lastClickRow);
    //将指定的行设置为0
    m_lastClickRow = 0;
void CSqlTest::on_saveBt_clicked()
    //调用提交函数(相当于更新所有修改的值)
    m_pModel->submitAll();
void CSqlTest::on_cancelBt_clicked()
    //取消所有未保存的修改
    m_pModel->revertAll();
void CSqlTest::on_autoSaveCheckBox_clicked(bool checked)
    //设置保存、取消按钮是否可用
    ui->saveBt->setEnabled(!checked);
    ui->cancelBt->setEnabled(!checked);
    //设置数据模型的编辑策略
    if(checked)
        //字段更新立即更新数据
        m_pModel->setEditStrategy(QSqlTableModel::OnFieldChange);
        //手动更新数据
        m_pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
void CSqlTest::on_tableView_clicked(const QModelIndex &index)
    //将最后点击的行赋值至变量中
    m_lastClickRow = index.row();
void CSqlTest::on_sortFunction()
    //判断当前是否指定字段,未指定则返回
    if(0 == ui->sortComboBox->currentIndex())
        return;
    //! 获取是升序还是降序(因为升序/降序按钮是单选按钮,所以判断一个即可)
    //! 因为升序/降序类型为Qt::SortOrder,所以用该类型变量存放即可
    Qt::SortOrder sortFlag = ui->ascRadioButton->isChecked()? Qt::AscendingOrder: Qt::DescendingOrder;
    //! 设置排序字段和排序方式
    //! 因为0被提示字符占用,所以获取到的index需要减1
    m_pModel->setSort(ui->sortComboBox->currentIndex() - 1, sortFlag);
    //重新获取数据使排序生效
    m_pModel->select();
void CSqlTest::on_findBt_clicked()
    //判断当前是否指定字段,未指定则将筛选设为空
    if(0 == ui->findComboBox->currentIndex())
        m_pModel->setFilter("");
        return;
    //筛选操作会自动刷新,无需再调用select()
    QString field = ui->findComboBox->currentText();
    QString val = ui->findValEdit->text();
    m_pModel->setFilter(QString("%1 = '%2'").arg(field).arg(val));

QSqlTableModel是一个为单个数据库表提供可编辑的数据模型;因为其能对数据表进行修改,所以在使用时需要小心,避免数据误删。刚开始学习Qt的小伙伴可以尝试使用该类做一个数据库管理工具出来。
昨天在
QSqlQuery、QSqlQueryModel的简单使用中提了一下二者结合的情况,其实QSqlTableModel就类似二者结合后的产物叭。
源码没有进行详细的测试,还有不少的BUG,有兴趣的小伙伴可用试着修复并完善其功能(其实是博主太懒了,哈哈哈)。

Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释)
Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释)
Qt数据库练习之QSqlRelationalTableModel的使用(MySql数据库示例,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

一、各操作示例提示:示例图中开始都先刷新了数据表,表明数据为最新数据;源码在本文第三节(源码含详细注释)。1.1 修改记录(数据)下图含手动更新记录和自动更新记录时的记录修改操作,其中前十秒是自动更新记录的操作,后十秒为手动更新记录的操作。1.2 添加记录(数据)下图为添加记录的操作,新添加的记录行的行标题是‘*’符号,并且当更新策略为手动更新时,需要手动保存记录。1.3 删除记录(数据)下图为删除记录的操作,删除后行的行标题变为‘!’,并且删除操作不区分自动/手动提交记录,无论怎样都是自 数据库的数据模型是将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了QT的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。 QSqlTableModle类: 成员函数: 1.绑定表格(数据库的表) [virtual] void QSqlTableModel::setTable(const QString &tableName); //传入表格名 插入一条记录 -- void setTable(const QString &tableName) //设置数据表名称 void setFilter(const QString &filter) //设置记录过滤条件 void setSort(int column,Qt::SortOrder order) //设置排序字段和排序规则,需调用select()才生...
00. 目录 文章目录00. 目录01. 概述02. 开发环境03. QSqlTableModel基本操作04. QSqlTableModel修改操作05. QSqlTableModel查询操作06. QSqlTableModel排序操作07. QSqlTableModel删除操作08. QSqlTableModel插入操作09. QSqlTableModel总结10. 附录 01. 概述 只读的QSqlQueryModel模型其实也可以实现编辑功能的,但是实现起来很麻烦。而QSqlTableModel提供
PyQt 有内置的数据库连接类 QtSql 。 在使用 PyQt 连接 MySql 展示数据时,如果明确所有数据库操作都与 Qt 窗口有关,且不涉及复杂的数据操作,则可以使用内置的 QtSql 类。不需要安装额外的数据库类,且能更加便利的与 QtTableView 等 Qt 控件进行数据交互。 db = QtSql.QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setDatabaseName('dev') db.setUserName('root') db.setPassword('123')
QT利用QSqlQuery类执行SQL语句并且还有对QSqlTableModel类操作。一共两种方法操作数据库。直接编译就行了,已经测试过,用的是qt5编译的。 包括:连接Mysql数据库,插入,修改,删除,查询指定数据等操作。
使用Python编程时,可以通过使用PyQt中的QSqlTableModel类来修改数据库。该类提供了一种将表格数据映射到SQL数据库的方式,并且可以自动将表格更改同步到数据库中。以下是一个示例代码,可以帮助你更好地理解如何使用QSqlTableModel类修改数据库: ```python from PyQt5.QtCore import Qt from PyQt5.QtSql import QSqlDatabase, QSqlTableModel # Connect to the database db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('example.db') db.open() # Create the model and set the table name model = QSqlTableModel() model.setTable('my_table') # Set the column names model.setHeaderData(0, Qt.Horizontal, 'ID') model.setHeaderData(1, Qt.Horizontal, 'Name') model.setHeaderData(2, Qt.Horizontal, 'Age') # Select the data model.select() # Modify a record record = model.record(0) record.setValue('Name', 'Alice') model.setRecord(0, record) # Submit the changes to the database model.submitAll() # Close the database connection db.close() 在这个例子中,我们首先连接到数据库并创建了一个QSqlTableModel对象。然后,我们设置了模型的表格名称和列名,并使用select()方法选择了所有数据。接下来,我们修改了第一行的记录,并使用submitAll()方法将更改提交到数据库中。最后,我们关闭了数据库连接。