QT基于model/view数据库编程2
Qt中数据编程主要分为以下两点:
1、利用qt提供类 访问数据库或者成为简单的数据库编程
2、数据库编程中引入model/view编程模型
基于model/view数据库编程:
qt提供model类: QSqlTableModel类 QSqlQueryModel类
Qt提供view类: QTableView
需要掌握两个知识:
(1)model/view编程步骤
(2)qt数据库编程步骤
案例:通过界面view控件实现对数据库中的一张表(姓名、年龄、成绩)中记录进行操作
(1)放置一个view控件 QTableView,设置属性
(2)连接数据库
(3)实例化模型和数据库表建立关联
(4)设置模型表头
(5)对模型数据进行 增加 删除 修改
(6)提交或者撤销
工程的参考代码如下:
widget.h中内容:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlTableModel>
#include <QSqlDatabase>
#include <QItemSelectionModel>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_btnSubmit_clicked();
void on_btnRevert_clicked();
void on_btnInsert_clicked();
void on_btnDelete_clicked();
private:
Ui::Widget *ui;
QSqlTableModel *theModel;
QItemSelectionModel *theSelection;
QSqlDatabase db;
};
#endif // WIDGET_H
widget.cpp文件内容:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true);
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/home/hua/students.db");
if(!db.open())
{
qDebug()<<"connect error";
return;
}
theModel = new QSqlTableModel(this,db);
theModel->setTable("stu");
theModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
theModel->select();
ui->tableView->setModel(theModel);
theModel->setHeaderData(0,Qt::Horizontal,"姓名");
theModel->setHeaderData(theModel->fieldIndex("age"),Qt::Horizontal,"年龄");
theModel->setHeaderData(2,Qt::Horizontal,"成绩");
theSelection = new QItemSelectionModel(theModel);
ui->tableView->setSelectionModel(theSelection);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnSubmit_clicked()
{
bool ret = theModel->submitAll();
if(!ret)
{
qDebug()<<"save error";
}
}
void Widget::on_btnRevert_clicked()
{
theModel->revertAll();
}
void Widget::on_btnInsert_clicked()
{
int row = ui->tableView->currentIndex().row();
theModel->insertRow(row);
QModelIndex index = theModel->index(row,0);
theSelection->clearSelection();
theSelection->setCurrentIndex(index,QItemSelectionModel::Select);
theModel->setData(theModel->index(row,1),20);
}
void Widget::on_btnDelete_clicked()
{
int row = ui->tableView->currentIndex().row();
theModel->removeRow(row);
}
main.cpp文件内容:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
QSqlQueryModel类:只读模型,查看数据库中,不能修改
开发中QSqlQueryModel类和QSqlQuery类一起配合进行数据库开发
QT基于model/view数据库编程2的更多相关文章
- Qt基于model/view数据库编程3
QSqlQueryModel和QSqlQuery类: 工程开发过程中将这两个类合起来使用,用QSqlQueryModel查询展示数据库中的数据,用QSqlQuery类执行sql语言,实现对数据库的操作 ...
- 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相关类类继承关系:
随机推荐
- 第一个servet(用注解),不用web.xml
环境: idea 1.新建模块 2.在蓝色src下新建一个包com.test 3.在包下新建servlet 4.写代码 package com.test; import javax.servlet.S ...
- oracle中时间戳转为Date类型的数据
问题描述: 一个表中原本应该存放date类型的数据,但是不知道之前哪位大仙把两个字段的类型建成了NUMBER类型的了,这样在后台看时间肯定不方便.现在需要改成date类型,但是现在库中是有数据的,不能 ...
- linux下(ubuntu)反删除(误删恢复)与回收站制作
刚刚有个小伙伴不小心删了他写了好几的天代码,为他心疼之余帮他找回了文件. 想到我之前也常常误删一些文件,就干脆分享一下我的反删除方法,并说说我做的回收站(好low的,求大神指点) 首先是反删除软件ex ...
- webpack起步
为什么要使用webpack 很牛逼的样子 https://www.webpackjs.com/comparison/ 基本概念 1. 入口(entry) module.exports = { entr ...
- 学习canvas
canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是那么 ...
- 数据结构复习之C语言指针与结构体
数据结构指针复习: #include <stdio.h> void main() { ] = {, , , , }; // a[3] == *(3+a) printf(+a)); // a ...
- 【Mood 21】要不要重复造轮子
90%的人应该使用另外10%的人制造的轮子 但是每个人都应该有能力去创造属于自己的轮子 使用不代表伸手拿来,使用也是需要学习的,使用也可以升级为创新,关键在于这个轮子是在谁的手中! 90%的能套用着别 ...
- Ubuntu(Debian)apt-get
Ubuntu(Debian)的aptitude与apt-get的区别和联系 最近在使用Puppet快速部署Openstack,看到一些没见过的工具,例如aptitude,在Ubuntu上有强大的a ...
- Spring MVC 如何加载静态html
在spring mvc的xml文件最后面加上下面这一行<mvc:deault-servlet-handler/>
- centos7部署ethereum私有链
https://github.com/ethereum/go-ethereum/wiki http://book.8btc.com/books/6/ethereum/_book/public-chai ...