• 15048阅读
  • 11回复

QT操作SQLITE数据库(三) [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-04
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
继续我的SQLite学习,这次的任务是存取大字段。
一,创建数据库
create table iconTable(icon blob);
二,QtDesigner设计界面
dlgIconDB.ui dlgIconDB.ui (3 K) 下载次数:115
三,编写代码如下:
(dlgIconDB.h)
#ifndef H_DLGICONDB_H
#define H_DLGICONDB_H
#include <QDialog>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlField>
#include <QPixmap>
#include <QMessageBox>
#include <QVariant>
#include <QBuffer>

#include <QFileDialog>
#include "ui_dlgIconDB.h"
class CDlgIconDB: public QDialog
{
Q_OBJECT;
public slots:
void next()
{
    query->next();
    //对我来说,这里至少有以下几个知识点
    //1。QLabel显示图标setPixmap
    //2。QVariant和QPixmap转换,通过QVariant的toByteArray转换
    //3。读取Query的字段值 Query.record().field("fieldname")
    //4。如何调用父类的析构函数?
    //5。Query如何新增记录?

    //这期间我犯了几个错误
    //1。以this.的方式访问类成员,
    //2。没有以public的方式继承QDialog

    QPixmap pixmap;
    pixmap.loadFromData(query->record().field("icon").value().toByteArray());
        ui_dialog.lblView->setPixmap(pixmap);
    };//查看后一个
void prev()
{
    query->previous();
    QPixmap pixmap;
    pixmap.loadFromData(query->record().field("icon").value().toByteArray());
    ui_dialog.lblView->setPixmap(pixmap);
    };//查看前一个
void browse()
{
  QString filename = QFileDialog::getOpenFileName(this, tr("打开图标"), "",tr("图标文件(*.ico)"));
  ui_dialog.lblBrowse->setPixmap(QIcon(filename).pixmap(16,16));
};//浏览,打开图标

void add()
{
            QByteArray ba;
            QBuffer buffer(&ba);
            buffer.open(QIODevice::ReadWrite);
            ui_dialog.lblBrowse->pixmap()->save(&buffer,"BMP");

            //这里默认传递的是NULL指针,导致save返回false。
            QVariant variant(ba);
            QSqlQuery qryInsert;
            qryInsert.prepare("insert into iconTable(icon) values(?)");
            qryInsert.bindValue(0, variant);
            qryInsert.exec();

    };//添加图标
public:
CDlgIconDB(QWidget * parent = 0):QDialog(parent)
{
  ui_dialog.setupUi(this);
  db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("iconDB");
  db.open();
  query = new QSqlQuery("select * from iconTable");
  connect(ui_dialog.btnBrowse, SIGNAL(clicked()),this,SLOT(browse()));
  connect(ui_dialog.btnAdd, SIGNAL(clicked()),this,SLOT(add()));
  connect(ui_dialog.btnPrev,SIGNAL(clicked()),this,SLOT(prev()));
  connect(ui_dialog.btnNext,SIGNAL(clicked()),this,SLOT(next()));
}
~CDlgIconDB(){delete query;};
private:
Ui_Dialog ui_dialog;
QSqlDatabase db;
QSqlQuery * query;
};
#endif
(main.cpp)
#include <QApplication>
#include <QTextCodec>
#include "dlgIconDB.h"
int main(int argc, char * argv[])
{
    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    CDlgIconDB dialog;
    dialog.show();
    return app.exec();
}
[ 此贴被wvins在2008-11-06 13:03重新编辑 ]
离线wvins
只看该作者 1楼 发表于: 2008-11-04
目前仅实现了打开图片的功能,还没找到合适的方式存入数据库。
---------
写惯了Delphi,都是通过Query直接Append,编辑,然后Update保存的
不知道Qt是否提供类似的操作方式,还望高手提点。

---------
不行的话,就自己通过Insert插入,然后定位到这条记录编辑了
离线wvins
只看该作者 2楼 发表于: 2008-11-05
继续学习,今天对QPixmap的操作又加深了认识,不过程序依旧没有完成。
修改后的代码看原帖,见绿色字体部分

从QByteArray中读取QPixmap方法
pixmap.loadFromData(query->record().field("icon").value().toByteArray());
保存QPixmap到QByteArray地方法
      QByteArray ba;
            QBuffer buffer(&ba);
            buffer.open(QIODevice::ReadWrite);
            QIcon(filename).pixmap(16,16).save(&buffer);
            QVariant variant(ba);
------------------------
目前的情况是,我的图标文件似乎没有保存到SQLite数据库中。
具体原因尚不清楚,
希望高手指点。
另外,谢谢dracula<draculaearl@gmail.com> 的提醒,不然我还真是没看见QPixmap的Save方法...
[ 此贴被wvins在2008-11-05 18:43重新编辑 ]
离线wvins
只看该作者 3楼 发表于: 2008-11-06
继续修改。
之前是不能够保存图像,郁闷坏了。
原来是Save的时候参数不对,
都怪Qt,默认值怎么是默认不对的值呢。。。

修改后的代码看原帖紫色部分

到目前为止这个小程序已经可以使用了,接下来的工作就是学习怎么构造一个树了
目前主要参考SimpleTreeModel,希望大家继续支持。
离线wvins
只看该作者 4楼 发表于: 2008-11-06
谢谢斑竹支持
离线6楼男生
只看该作者 5楼 发表于: 2009-03-11
thank you for your share
离线bborn

只看该作者 6楼 发表于: 2009-03-11
qt  是不是不能加密sqlite 数据库?
就是设置数据库的访问密码?

setPassword没有效果  

不过好像sqlite也没有提供这个功能
离线ren0065
只看该作者 7楼 发表于: 2009-03-16
啊里阿道,库大一马斯
离线蓝调
只看该作者 8楼 发表于: 2009-10-10
回 楼主(wvins) 的帖子
楼主你好,看了你发表的三篇,收获不少,十分感谢!

有一点不明白,就是你写的第一步
一,创建数据库
create table iconTable(icon blob); 如何创建???


CDlgIconDB(QWidget * parent = 0):QDialog(parent)
{
  ui_dialog.setupUi(this);
  db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("iconDB");
  db.open();
......
}
中的db.setDatabaseName("iconDB");  “iconDB” 有什么区别??
离线蓝调
只看该作者 9楼 发表于: 2009-10-10
回 楼主(wvins) 的帖子
呵呵,搞明白了!
离线sunvim

只看该作者 10楼 发表于: 2009-10-12
   好帖!感谢分享
离线jidonghui123
只看该作者 11楼 发表于: 2011-11-03
知道怎么回事了
快速回复
限100 字节
 
上一个 下一个