Qt基于model/view数据库编程3
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的更多相关文章
- QT基于model/view数据库编程2
Qt中数据编程主要分为以下两点:1.利用qt提供类 访问数据库或者成为简单的数据库编程2.数据库编程中引入model/view编程模型 基于model/view数据库编程: qt提供model类: Q ...
- Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)
最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...
- PyQt学习随笔:Qt中Model/View中的Model Index
Qt中Model/View中的Model Index是一个类,该类用于定位Model/View中数据模型中的数据. Model Index是从QAbstractItemModel派生的子类,用于在项视 ...
- PyQt学习随笔:Qt中Model/View中的怎么构造View匹配的Model
老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相 ...
- Qt基于tcp协议网络编程
基于Qt网络编程: 基于tcp协议 c/s模式编程 所需要的类:QTcpServer QTcpSocket 利用qt基于tcp协议编写c/s模式程序: 两个类中的信号: QTcpServer : ne ...
- Qt - 基于HTTP的网络编程
HTTP(超文本传输协议 Hyper Text Transfer Protocol) 基于TCP/IP通信协议,属于应用层协议. 使用情况: HTTP是无连接(无连接的含义是限制每次连接只处理一个请求 ...
- Qt - 基于TCP的网络编程
TCP(传输控制协议 Transmission Control Protocol) 可靠.面向数据流.面向连接 的传输协议.(许多应用层协议都是以它为基础:HTTP.FTP) 使用情况: 相比UDP ...
- Qt - 基于UDP的网络编程
UDP(用户数据报协议 User Data Protocol) 轻量级.不可靠.面向数据报.无连接 的传输层协议. 适用情况: 网络数据大多为短消息: 拥有大量客户端: 对数据安全无特殊要求: 网络 ...
- PyQt学习随笔:Qt中Model/View相关的主要类及继承关系
View相关类类继承关系: Model相关类类继承关系:
随机推荐
- hello2详解
1.GreetingServlet.java(显示问候页面表单) 此servlet重写该doGet方法,实现GETHTTP方法.servlet显示一个简单的HTML问候表单,其提交按钮就像hello1 ...
- linux环境下 mysql数据库忘记密码 处理办法
整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...
- asp.net学习视频大全(共800集)
今天在网上找asp.net学习视频时,发现了一些好的学习资源,记录一下供大家学习. 资料名称 下载地址 <ASP.NET4.0从入门到精通>随书教学视频 http://down.51ct ...
- CSS如何设置换行文字自动对齐
CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'> <li> ...
- 云端基于Docker的微服务与持续交付实践
云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...
- cordova 开发 android app 简要流程
1. 安装cordova:npm install -g cordova --registry=https://registry.npm.taobao.org 2. 创建cordova工程:进入工作目录 ...
- CSS3中的Flexbox弹性布局(一)
CSS3引入了一种新的布局模式——Flexbox布局,即伸缩布局盒模型(Flexible Box),用来提供一个更加有效的方式制定.调整和分布一个容器里项目布局,即使它们的大小是未知或者动态的,这里简 ...
- maven学习(三)maven仓库
官网图片: maven仓库: 仓库通常配置在settings.xml文件中,此处注意settings.xml的优先级:用户 > 全局,广义上maven的仓库一共包含两种: 1.本地仓库,默认在& ...
- ubuntu下go开发环境
https://qiita.com/necomeshi/items/676ccb669d6e6102117b 安装 https://golang.org/dl/ # 下载&解压 axel -n ...
- Centos7安装完毕后无法联网的解决方法(转)
今天在VMware虚拟机中经过千辛万苦终于安装好了centos7..正兴致勃勃的例行yum update 却发现centos系统貌似默认网卡没配置好,反馈无法联网.经过一番研究,终于让centos连上 ...