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. OLEDB不使用SQL语句直接打开数据表

    一般来说获取数据库表的方法是采用类似 select * from table_name 这样的sql语句.SQL语句必然伴随着数据库的解释执行,一般来说效率比较低下,而且使用SQL语句时需要数据库支持 ...

  2. .NET开源工作流RoadFlow-流程运行-菜单配置

    经过流程设计和表单设计后,一个流程就设置完成了,下面说说怎么让设计好的流程运行起来吧. 流程和表单设计完成发布后都在应用程序库里,我们只要将流程在角色应用中配置给相应的用户即可让流程选择了. 在系统管 ...

  3. 【Linux】小应用 大智慧

    小应用 大智慧--重视 以工程师的标准要求自己

  4. matlab练习程序(旋转、径向模糊)

    还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到 ...

  5. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

     在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...

  6. Android学习——ViewPager的使用(一)

    这一节介绍使用ViewPager,加载ViewPager主要有三部分,数据源.适配器和ViewPager与适配器关联.其中数据源分为View对象和Fragment对象,这一节先来介绍View对象. 数 ...

  7. Hadoop ->> 关于数据分割(Data Split)的思考

    今天开始学习Hadoop这门热门的数据库技术.直接从被奉为Hadoop圣经的<Hadoop The Definitive Guide 4th Edition>入手.第一章作者写到一个关于分 ...

  8. 常见协议TCP、UDP、IP图

    ip tcp udp icmp help ip tcp http icmp

  9. 四、获取远程URL图片

    #!/usr/bin/python # -*- coding: UTF-8 -*- import re import urllib def getHtml(url): page = urllib.ur ...

  10. python入门4 python查看数据类型及类型转换

    查看数据类型:type() 类型转换:int(),float(),char(),ord(),str(),bool() #coding:utf-8 #/usr/bin/python "&quo ...