月度归档:2009年09月

qt中保存图片数据到数据库

转自:http://www.qtcn.org/bbs/read.php?tid=13674

继续我的SQLite学习,这次的任务是存取大字段。 
一,创建数据库 
create table iconTable(icon blob); 
二,QtDesigner设计界面 
dlgIconDB.ui
dlgIconDB.ui 
三,编写代码如下: 
(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(); 
}