http://download.csdn.net/download/cibiren2011/10036058
头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QtSql>
#include <QSqlTableModel>
#include <QStandardItemModel>
#include <QTableView>
#include <QTreeView>
#include <QStandardItem>
#include <QSqlQuery>
#include <QPushButton>
#include <QVBoxLayout>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTreeView *treeView;
QTableView *tablev;
QSqlDatabase db;
QStandardItemModel *stdModel;
QSqlTableModel *tableModel;
QPushButton *btnAbout;
QPushButton *btnDel;
QPushButton *btnModfy;
void addToModel(int pid,QStandardItem* pRoot);
void writeToDB(QStandardItem* pRoot);
private slots:
void About();
void Del();
void Modify();//更新数据库};
#endif // WIDGET_H
CPP文件:
#include "widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//initData();
db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=test.mdb");
db.open();
stdModel=new QStandardItemModel(this);
// tableModel=new QSqlTableModel(this,db);
treeView=new QTreeView;
//tablev=new QTableView ;
// tableModel->setTable("goods");
// tableModel->select();
// tablev->setModel(tableModel);
addToModel(0,stdModel->invisibleRootItem());
treeView->setModel(stdModel);
QVBoxLayout * layout=new QVBoxLayout ;
QHBoxLayout *hlayout=new QHBoxLayout;
btnAbout=new QPushButton("aboutQt");
btnDel=new QPushButton("Delete");
btnModfy=new QPushButton("Modify");
hlayout->addWidget(btnAbout);
hlayout->addWidget(btnDel);
hlayout->addWidget(btnModfy);
// layout->addWidget(tablev);
layout->addWidget(treeView);
layout->addLayout(hlayout);
setLayout(layout);
connect(btnDel,SIGNAL(clicked()),this,SLOT(Del()));
connect(btnModfy,SIGNAL(clicked()),this,SLOT(Modify()));
connect(btnAbout,SIGNAL(clicked()),this,SLOT(About()));
}
Widget::~Widget()
{
}
//把数据库中字段PID=pID的项添加到树上,递归函数
//参数 int pid :父节点的ID
//QStandardItem* pParent :上级项节点
void Widget::addToModel(int pID,QStandardItem* pParent)
{
QString qreryString=
QString("SELECT id,pid,goodname FROM goods where pid=%1 order by id").arg(pID);
QSqlQuery query(qreryString,db);
while (query.next()) {
//sqlRecord record;
int id = query.value(0).toInt();
int pid= query.value(1).toInt();
QString name= query.value(2).toString();
QVariant vid(id);
QVariant vpid(pid);
QVariant vname(name);
QList<QVariant> itemdata;
itemdata<<vid<<vpid<<vname;
QStandardItem* item =new QStandardItem(name);
item->setData(itemdata,Qt::UserRole+1);
pParent->appendRow(item);
addToModel(id, item);
}
}
//递归函数,把模型里面的数据写到数据库里面
void Widget::writeToDB(QStandardItem* item)
{
if(item==0) return;
if(item!=stdModel->invisibleRootItem()){
QList<QVariant> itemdata = item->data(Qt::UserRole+1).toList();
QSqlQuery query(db);
query.prepare("INSERT INTO goods (id, pid, goodname)"
"VALUES (?, ?, ?)");
query.addBindValue(itemdata.at(0).toInt());
query.addBindValue(itemdata.at(1).toInt());
query.addBindValue(itemdata.at(2).toString());
query.exec();
}
for(int i=0;i<item->rowCount();i++){
writeToDB(item->takeChild(i));
}
}
void Widget::About()
{
QMessageBox::aboutQt(this);
}
void Widget::Del()
{
QModelIndex index= treeView->currentIndex();
stdModel->removeRow(index.row(), index.parent());
}
void Widget::Modify(){
//清空数据库
QSqlQuery query(db);
query.exec("delete * from goods");
//把模型里面的数据写到数据库里面
QStandardItem * pRoot=stdModel->invisibleRootItem();
writeToDB(pRoot);
}
4 个解决方案
#1
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。
#2
数据库里面是对的,调用下面这个函数后,
树视控件显示有问题,不知什么缘故。
void Widget::Modify(){ //清空数据库 QSqlQuery query(db); query.exec("delete * from goods"); //把模型里面的数据写到数据库里面 QStandardItem * pRoot=stdModel->invisibleRootItem(); writeToDB(pRoot); }
#3
调用下面这个Modify()函数后,打开数据库查看,数据库里面数据是对的,
但是,树视控件没有文本了,显示有问题,不知什么缘故。
void Widget::Modify(){
//清空数据库
QSqlQuery query(db);
query.exec("delete * from goods");
//把模型里面的数据写到数据库里面
QStandardItem * pRoot=stdModel->invisibleRootItem();
writeToDB(pRoot);
}
#4
Modify()函数只是修改了数据库里的数据,没有修改模型里的数据,为什么树控件里的文本都不见了?
#1
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。
#2
数据库里面是对的,调用下面这个函数后,
树视控件显示有问题,不知什么缘故。
void Widget::Modify(){ //清空数据库 QSqlQuery query(db); query.exec("delete * from goods"); //把模型里面的数据写到数据库里面 QStandardItem * pRoot=stdModel->invisibleRootItem(); writeToDB(pRoot); }
#3
调用下面这个Modify()函数后,打开数据库查看,数据库里面数据是对的,
但是,树视控件没有文本了,显示有问题,不知什么缘故。
void Widget::Modify(){
//清空数据库
QSqlQuery query(db);
query.exec("delete * from goods");
//把模型里面的数据写到数据库里面
QStandardItem * pRoot=stdModel->invisibleRootItem();
writeToDB(pRoot);
}
#4
Modify()函数只是修改了数据库里的数据,没有修改模型里的数据,为什么树控件里的文本都不见了?