QSqlQueryModel和QSqlQuery类:

工程开发过程中将这两个类合起来使用,用QSqlQueryModel查询展示数据库中的数据,
用QSqlQuery类执行sql语言,实现对数据库的操作。

案例:数据库中有一张表,存储学员姓名、年龄、成绩和照片。通过一个图形界面实现对学员信息
的浏览、修改和编辑,其中照片的字段类型是blob类型,界面上通过label显示照片
信息。

各个文件代码如下:
widget.h内容

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQueryModel>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

private slots:
void on_btnInsert_2_clicked();

void on_btnEdit_clicked();

void on_btnBrown_clicked();

private:
Ui::Widget *ui;
QSqlDatabase db;
QSqlQueryModel *theModel;
};

#endif // WIDGET_H

widget.cpp文件内容:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QFileDialog>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/home/hua/demostudent.db");
if(!db.open())
{
qDebug()<<"connect database error";
return;
}

theModel = new QSqlQueryModel(this);
theModel->setQuery("select id,name,age,photo from stu");
theModel->setHeaderData(0,Qt::Horizontal,"empId");
theModel->setHeaderData(1,Qt::Horizontal,"empName");
theModel->setHeaderData(2,Qt::Horizontal,"empAge");

ui->tableView->setModel(theModel);
ui->tableView->setColumnHidden(3,true);//隐藏第四列,照片在label中显示

layout()->setSizeConstraint(QLayout::SetFixedSize);
}

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

//插入按钮的槽函数代码,获取用户数据,包括照片,组成sql语句然后执行。
void Widget::on_btnInsert_2_clicked()
{
QSqlQuery query;
query.prepare("insert into stu(id,name,age,photo) values(?,?,?,?)");

QString aFile = QFileDialog::getOpenFileName(this,"select photo","","photo(*.jpg)");
if(aFile.isEmpty())
return;
QByteArray data;
QFile *file = new QFile(aFile);
file->open(QIODevice::ReadOnly);
data = file->readAll();
file->close();

QPixmap pic;
pic.loadFromData(data);
ui->labPhoto->setPixmap(pic.scaledToWidth(ui->labPhoto->size().width()));

query.bindValue(0,1007);
query.bindValue(1,"zhang");
query.bindValue(2,23);
query.bindValue(3,data);

if(!query.exec())
{
qDebug()<<"insert sql error";
}
}

//编辑信息按钮的槽函数,主要更改指定学员的照片
void Widget::on_btnEdit_clicked()
{
int row = ui->tableView->currentIndex().row();
QSqlRecord curRec = theModel->record(row);

int empNo = curRec.value("id").toInt();

QString aFile = QFileDialog::getOpenFileName(this,"select photo","","photo(*.jpg)");
if(aFile.isEmpty())
return;
QByteArray data;
QFile *file = new QFile(aFile);
file->open(QIODevice::ReadOnly);
data = file->readAll();
file->close();

QSqlQuery query;
query.prepare("update stu set photo = :Data where id = :ID");
query.bindValue(":ID",empNo);
query.bindValue(":Data",data);

qDebug()<<empNo;

if(!query.exec())
{
qDebug()<<"update error";
return;
}

}

//浏览信息按钮的槽函数,显示当前所选择的记录的的照片信息

void Widget::on_btnBrown_clicked()
{
int row = ui->tableView->currentIndex().row();
QSqlRecord record = theModel->record(row);

QVariant va = record.value("photo");
if(!va.isValid())
{
ui->labPhoto->clear();
}else
{
QByteArray data = va.toByteArray();
QPixmap pic;
pic.loadFromData(data);
ui->labPhoto->setPixmap(pic.scaledToWidth(ui->labPhoto->size().width()));
}
}

main.cpp文件内容:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

Qt基于model/view数据库编程3的更多相关文章

  1. QT基于model/view数据库编程2

    Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 基于model/view数据库编程: qt提供model类: Q ...

  2. Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

    最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...

  3. PyQt学习随笔:Qt中Model/View中的Model Index

    Qt中Model/View中的Model Index是一个类,该类用于定位Model/View中数据模型中的数据. Model Index是从QAbstractItemModel派生的子类,用于在项视 ...

  4. PyQt学习随笔:Qt中Model/View中的怎么构造View匹配的Model

    老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相 ...

  5. Qt基于tcp协议网络编程

    基于Qt网络编程: 基于tcp协议 c/s模式编程 所需要的类:QTcpServer QTcpSocket 利用qt基于tcp协议编写c/s模式程序: 两个类中的信号: QTcpServer : ne ...

  6. Qt - 基于HTTP的网络编程

    HTTP(超文本传输协议 Hyper Text Transfer Protocol) 基于TCP/IP通信协议,属于应用层协议. 使用情况: HTTP是无连接(无连接的含义是限制每次连接只处理一个请求 ...

  7. Qt - 基于TCP的网络编程

    TCP(传输控制协议 Transmission Control Protocol) 可靠.面向数据流.面向连接  的传输协议.(许多应用层协议都是以它为基础:HTTP.FTP) 使用情况: 相比UDP ...

  8. Qt - 基于UDP的网络编程

    UDP(用户数据报协议 User Data Protocol) 轻量级.不可靠.面向数据报.无连接  的传输层协议. 适用情况: 网络数据大多为短消息: 拥有大量客户端: 对数据安全无特殊要求: 网络 ...

  9. PyQt学习随笔:Qt中Model/View相关的主要类及继承关系

    View相关类类继承关系: Model相关类类继承关系:

随机推荐

  1. .net比较两个时间的大小,不含日期,精确到分

    解决方案: 1.将要比较的两个时间转成DateTime类型: DateTime date1 = DateTime.Parse("8:00"); DateTime date2 = D ...

  2. 如何用 windows+github搭建一个优美的hexo博客

    1.Hexo简单介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 风一般的速度Hexo基于Nod ...

  3. 从零开始的全栈工程师——ajax

    AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = Asynchronous JavaScript and XML. AJAX 是一种用于创建快速动态网页 ...

  4. caffe-windows中classification.cpp的源码阅读

    caffe-windows中classification.cpp的源码阅读 命令格式: usage: classification string(模型描述文件net.prototxt) string( ...

  5. 【转】dB的计算方法

    原文地址:https://www.espressif.com/zh-hans/media/blog/%E5%A2%9E%E7%9B%8A%E6%AF%94%E5%80%BC-db-%E4%BB%A5% ...

  6. Enumeration 接口的使用

          Enumeration是一个接口,定义了两个规则,可以获取连续的数据,对数据结构非常重要.       接口源码: publicinterfaceEnumeration<E>{ ...

  7. Siebel escript学习笔记

    Siebel(escript)的学习:1.Siebel的数据类型Primitive(原始的)---Number,Integer,Hexadecimal(十六进制),Octal(八进制),Floatin ...

  8. mongodb 3.4 学习 (三)复制集

    复制集(replica set) 复制集是一组mongodb的进程维护同样的数据集,提供冗余与高可用性.最小的复制集由3台服务器(或者3个实例)组成,最多1个primary和2个secondary实例 ...

  9. apache-实战(一)

     Apache 1.html的完整格式 # vim /var/www/html/index.html<html><head><title>我要</title& ...

  10. springIOC的那些事

       springIOC动态代理的那些事儿 1.发现问题 今天在使用spring的IOC容器时发现了这样的一个问题: 首先有一个接口定义如下: public interface BookShopSer ...