数据库读写,生成树,操作异常,求教,付源代码

cibiren2011 2017-10-23 02:34:29
数据库读写,生成树,操作异常,求教,付源代码及数据库
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);
}

...全文
401 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cibiren2011 2017-10-29
  • 打赏
  • 举报
回复
引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。
Modify()函数只是修改了数据库里的数据,没有修改模型里的数据,为什么树控件里的文本都不见了?
cibiren2011 2017-10-29
  • 打赏
  • 举报
回复
引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。


调用下面这个Modify()函数后,打开数据库查看,数据库里面数据是对的,
但是,树视控件没有文本了,显示有问题,不知什么缘故。


void Widget::Modify(){
//清空数据库
QSqlQuery query(db);
query.exec("delete * from goods");
//把模型里面的数据写到数据库里面
QStandardItem * pRoot=stdModel->invisibleRootItem();
writeToDB(pRoot);
}
cibiren2011 2017-10-29
  • 打赏
  • 举报
回复
引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。
数据库里面是对的,调用下面这个函数后, 树视控件显示有问题,不知什么缘故。

void Widget::Modify(){     //清空数据库     QSqlQuery query(db);     query.exec("delete * from goods");     //把模型里面的数据写到数据库里面    QStandardItem * pRoot=stdModel->invisibleRootItem();   writeToDB(pRoot); } 
  • 打赏
  • 举报
回复
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧