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. hello2详解

    1.GreetingServlet.java(显示问候页面表单) 此servlet重写该doGet方法,实现GETHTTP方法.servlet显示一个简单的HTML问候表单,其提交按钮就像hello1 ...

  2. linux环境下 mysql数据库忘记密码 处理办法

    整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...

  3. asp.net学习视频大全(共800集)

    今天在网上找asp.net学习视频时,发现了一些好的学习资源,记录一下供大家学习. 资料名称 下载地址 <ASP.NET4.0从入门到精通>随书教学视频  http://down.51ct ...

  4. CSS如何设置换行文字自动对齐

    CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'>                <li>         ...

  5. 云端基于Docker的微服务与持续交付实践

    云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...

  6. cordova 开发 android app 简要流程

    1. 安装cordova:npm install -g cordova --registry=https://registry.npm.taobao.org 2. 创建cordova工程:进入工作目录 ...

  7. CSS3中的Flexbox弹性布局(一)

    CSS3引入了一种新的布局模式——Flexbox布局,即伸缩布局盒模型(Flexible Box),用来提供一个更加有效的方式制定.调整和分布一个容器里项目布局,即使它们的大小是未知或者动态的,这里简 ...

  8. maven学习(三)maven仓库

    官网图片: maven仓库: 仓库通常配置在settings.xml文件中,此处注意settings.xml的优先级:用户 > 全局,广义上maven的仓库一共包含两种: 1.本地仓库,默认在& ...

  9. ubuntu下go开发环境

    https://qiita.com/necomeshi/items/676ccb669d6e6102117b 安装 https://golang.org/dl/ # 下载&解压 axel -n ...

  10. Centos7安装完毕后无法联网的解决方法(转)

    今天在VMware虚拟机中经过千辛万苦终于安装好了centos7..正兴致勃勃的例行yum update 却发现centos系统貌似默认网卡没配置好,反馈无法联网.经过一番研究,终于让centos连上 ...