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的更多相关文章

  1. Qt基于model/view数据库编程3

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

  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. linq之Capacity(转载)

    出处:博客园 作者:mumuliang 连接:http://www.cnblogs.com/mumuliang/p/3914425.html Capacity 在.NET中List的容量应该只是受到硬 ...

  2. 01.里氏准换与using关键字

    using关键字有什么用?什么是IDisposable? using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后 ...

  3. HDU 5012 骰子旋转(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 保存骰子的状态,然后用dfs或者bfs搜索 还是再讲一下dfs 我们的目标是找一个与b相同,且转次数最少的 ...

  4. 正则表达式把所有Paul替换成Ringo:Paul Puala Pualine paul Paul

    代码实现如下: <!DOCTYPE html><html><body> <h2>JavaScript Regular Expressions</h ...

  5. 洛谷P1970 花匠(dp)

    题意 题目链接 Sol 直接用\(f[i][0/1]\)表示到第\(i\)个位置,该位置是以上升结尾还是以下降结尾 转移的时候只需枚举前一个即可 #include<cstdio> #inc ...

  6. iframe中插入代码并执行

    最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...

  7. Oracle 数据库异机恢复(归档模式)

    操作必须在服务器上进行(在192.168.12.71上执行) 0.按需要恢复的日期,把距恢复日期最近的全部备份和全部备份日期后的日志备份一同拷贝到需要恢复的机器上: 1.用RMAN登陆 C:\User ...

  8. jmeter中CSV Data Set Config各项说明

    Config the CSV Data Source: 1)Filename:csv文件的名称(包括绝对路径,当csv文件在bin目录下时,只需给出文件名即可) 2)File encoding:csv ...

  9. Shell脚本批量修改图片尺寸

    #!/bin/sh function scandir(){ local cur_dir parent_dir workdir workdir=$ cd ${workdir} if [ ${workdi ...

  10. JavaScript专题

    1. 在ajax的任何回调方法中,比如success回调,使用return,将会无效 2. //todo