打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
QT6数据库操作
userphoto

2022.07.31 北京

关注

在使用QTableView对数据展示时,想实现文字居左,数字居右等多种显示样式,一开始一直在QTableView中寻找解决方案,后来看过官方例子后才发现是修改QSqlQueryModel的方式实现。

我将之前的例子稍做修改也实现了5个功能

  1. 学号左侧加#号
  2. 学号居中显示
  3. 姓名字母变为大写
  4. 分数居右显示
  5. 根据分数区分颜色

本项目中实现该功能,主要有四步

  1. 在.pro文件中增加对数据库的支持
  2. 配置数据库
  3. 自定义类CustomSqlModel
  4. 使用CustomSqlModel对象

1. 在.pro文件中增加对数据库的支持

使用数据库就需要在项目文件.pro中加上这句话 QT += sql

QT       += core gui
QT       += sql

2. 配置数据库

void MainWindow::openDataBase(){
    // QMYSQLDriver
    db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");    //数据库服务器
    db.setPort(3306);
    db.setUserName("root");        //数据库用户名
    db.setPassword("root");        //数据库密码
    db.setDatabaseName("test");    //数据库名
    if(db.open()==true)
        qDebug() <<"数据库打开成功";
    else
        qDebug() <<"数据库打开失败";
}

3. 自定义类CustomSqlModel

  • 定义类,继承QSqlQueryModel
  • 重写data方法

CustomSqlModel.h,全部代码

#ifndef CUSTOMSQLMODEL_H
#define CUSTOMSQLMODEL_H

#include <QSqlQueryModel>

class CustomSqlModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    CustomSqlModel(QObject *parent = nullptr);

    QVariant data(const QModelIndex &item, int role) const override;
};

#endif

CustomSqlModel.cpp,全部代码

#include <QtWidgets>

#include "CustomSqlModel.h"

CustomSqlModel::CustomSqlModel(QObject *parent)
    : QSqlQueryModel(parent)
{
}
QVariant CustomSqlModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
    QVariant value = QSqlQueryModel::data(index, role);
    if (value.isValid())
    {
        if( index.column() == 0)
            return value.toString().prepend('#');  //Id加“#”
        else if (index.column() == 1){  
            return value.toString().toUpper(); //姓名字母大写
        }

    }

    if (role == Qt::TextAlignmentRole && index.column() == 0)
    {
        value = Qt::AlignCenter; // Id居中
        return value;
    }

    if (role == Qt::ForegroundRole && index.column() == 2)
    {

        if(index.data().toFloat() >= 60) //区分分数的颜色
            return QVariant::fromValue(QColor(Qt::blue));
        else
            return QVariant::fromValue(QColor(Qt::red));
    }

    if (role == Qt::TextAlignmentRole && index.column() == 2)
    {
        value = int(Qt::AlignRight) + int(Qt::AlignVCenter); // 数值靠右,垂直居中
        return value;
    }
    return value;
}

4. 使用CustomSqlModel对象

  • 在头文件中定义CustomSqlModel *model;
  • 在源文件中new对象,model =new CustomSqlModel(this);

mainwindow.h,全部代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include "CustomSqlModel.h"
#include <QSqlError>
#include <QDebug>
#include <QMessageBox>
#include <QStandardItem>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void openDataBase();
    void queryTable();
    void setStatus(int);
private slots:
    void on_updateButton_clicked();

    void on_insertButton_clicked();

    void on_delButton_clicked();

    void on_tableView_clicked(const QModelIndex &index);

    void on_cancelButton_clicked();

    void on_saveButton_clicked();

private:
    Ui::MainWindow *ui;
    QSqlDatabase db; //数据库
    CustomSqlModel *model;
    int editType=0;//0:初始态/1:新增/2:编辑
};
#endif // MAINWINDOW_H

mainwindow.cpp,全部代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model =new CustomSqlModel(this);
    openDataBase();
    queryTable();
    //选择整行
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    //不可编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //tableView表头居中
    ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter);
    setStatus(0);

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_updateButton_clicked()
{
    setStatus(2);

}


void MainWindow::on_insertButton_clicked()
{
    setStatus(1);
}


void MainWindow::on_delButton_clicked()
{
    QSqlQuery query;
    query.prepare("delete from student where id = :id");
    query.bindValue(":id", ui->idEdit->text().toInt());
    if(QMessageBox::question(this,"删除","确定要删除该数据吗?",QMessageBox::Yes|QMessageBox::No) == QMessageBox::No)
        return;

    if(!query.exec())
        qDebug()<< " 删除 error: "<<query.lastError();
    else
        qDebug()<< "删除成功!";
    queryTable();
}


void MainWindow::openDataBase(){
    db=QSqlDatabase::addDatabase("QMYSQL");
    // QMYSQLDriver
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("root");
    db.setDatabaseName("test");
    if(db.open()==true)
        qDebug() <<"数据库打开成功";
    else
        qDebug() <<"数据库打开失败";
}


void MainWindow::queryTable(){
    editType=0;
    model->setQuery("select * from student");

    ui->tableView->setModel(model);
    model->setHeaderData(0, Qt::Horizontal, tr("学号"));
    model->setHeaderData(1, Qt::Horizontal, tr("姓名"));
    model->setHeaderData(2, Qt::Horizontal, tr("成绩"));

}


void MainWindow::on_tableView_clicked(const QModelIndex &index)
{
    //获取行号
    int row =index.row();
    //也可以这样
    //row = ui-> tableView ->currentIndex().row();

    QString id=ui->tableView->model()->index(row,0).data().toString();
    //去掉#号并显示
    ui->idEdit->setText(id.right(id.length()-1));
    ui->nameEdit->setText(ui->tableView->model()->index(row,1).data().toString());
    ui->scoreEdit->setText(ui->tableView->model()->index(row,2).data().toString());

}
void MainWindow::setStatus(int status){
    editType=status;
    if(status==1){
        ui->idEdit->setText("");
        ui->nameEdit->setText("");
        ui->scoreEdit->setText("");
        ui->idEdit->setEnabled(true);
        ui->nameEdit->setEnabled(true);
        ui->scoreEdit->setEnabled(true);
        ui->cancelButton->setEnabled(true);
        ui->saveButton->setEnabled(true);
        ui->insertButton->setEnabled(false);
        ui->updateButton->setEnabled(false);
        ui->delButton->setEnabled(false);
        ui->idEdit->setFocus();
        return;
    }
    if(status==2){
        ui->idEdit->setEnabled(false);
        ui->nameEdit->setEnabled(true);
        ui->scoreEdit->setEnabled(true);
        ui->cancelButton->setEnabled(true);
        ui->saveButton->setEnabled(true);
        ui->insertButton->setEnabled(false);
        ui->updateButton->setEnabled(false);
        ui->delButton->setEnabled(false);
        ui->idEdit->setFocus();
        return;
    }
    ui->idEdit->setText("");
    ui->nameEdit->setText("");
    ui->scoreEdit->setText("");
    ui->idEdit->setEnabled(false);
    ui->nameEdit->setEnabled(false);
    ui->scoreEdit->setEnabled(false);
    ui->cancelButton->setEnabled(false);
    ui->saveButton->setEnabled(false);
    ui->insertButton->setEnabled(true);
    ui->updateButton->setEnabled(true);
    ui->delButton->setEnabled(true);
}

void MainWindow::on_cancelButton_clicked()
{
    setStatus(0);
}


void MainWindow::on_saveButton_clicked()
{
    if(ui->idEdit->text() == ""||!ui->idEdit->text().toInt()){
          QMessageBox::critical(this,"提示","id不能为空且必须为数字!");
          return;
    }
    if(ui->nameEdit->text() == ""){
          QMessageBox::critical(this,"提示","姓名不能为空!");
          return;
    }
    if(ui->scoreEdit->text() == ""||!ui->scoreEdit->text().toFloat()){
          QMessageBox::critical(this,"提示","成绩不能为空且必须为数字!");
          return;
    }
    int id = ui->idEdit->text().toInt();
    QString name = ui->nameEdit->text();
    float score = ui->scoreEdit->text().toFloat();

    QSqlQuery query;
    if(editType==1){
        QSqlQuery query;
            query.prepare("insert into student(id,name,score) values(:id,:name,:score)");
            query.bindValue(":id", id);
            query.bindValue(":name", name);
            query.bindValue(":score", score);
        if(!query.exec()){
            QMessageBox::critical(this,"提示","新增失败!"+query.lastError().text());
            return;
        }
    }
    if(editType==2){
        query.prepare("update student set name = :name, score = :score where id =:id");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":score", score);
        if(!query.exec()){
            QMessageBox::critical(this,"提示","修改失败!"+query.lastError().text());
            return;
        }
    }
    QMessageBox::critical(this,"提示","保存成功!");
    setStatus(0);
    queryTable();
}

最终效果


以上仅供参考,如有疑问,欢迎探讨。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Qt笔记(1)连接 SQL Server 数据库
关于QT的系统总结(非常全面,非常好)
<QT>自定义标题栏拖放/最大化/最小化/关闭窗口功能
Qt数据库总结
Qt编写串口通信程序全程图文讲解(三)(转)
Qt框架、继承、常用控件、方法、工程创建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服