qsqlite存儲一個blob字段
第一種,通過直接使用sql語句進行存儲:
sql = QString("INSERT INTO phone_video_fragment_display (_id,thumbnail,name,video_fragment_id) VALUES(%1,:thumbnail,'%2',%3);")
.arg(i64_phone_video_fragment_display_max_id)
.arg("demo....")
.arg(i64_phone_video_fragment_max_id);
query.prepare(sql);
//示例圖片
QFile o_demo_jpeg("demo.jpg");
auto open_result = o_demo_jpeg.open(QIODevice::ReadOnly);
auto ba_demo_jpeg = o_demo_jpeg.readAll();
query.bindValue(":thumbnail",ba_demo_jpeg);
qDebug() << query.boundValues();
auto exe_result = query.exec();
auto error = query.lastError();
qDebug() << error.text();
如上將thumbnail 圖片存入數據庫
第二種,通過更上層的接口
QSqlTableModel提供的insertRecord
(QSqlTableModel關聯一個數據庫的一張表,對其進行顯示或者操作)
QSqlRecord record;
QSqlField _id("_id",QVariant::LongLong);
_id.setValue(i64_phone_video_fragment_display_max_id);
QSqlField image("thumbnail",QVariant::ByteArray);
image.setValue(ba_demo_jpeg);
QSqlField name("name",QVariant::String);
name.setValue(QString::number(i64_phone_video_fragment_display_max_id));
QSqlField video_fragment_id("video_fragment_id",QVariant::LongLong);
video_fragment_id.setValue(i64_phone_video_fragment_max_id);
record.append( _id );
record.append( image );
record.append( name );
record.append( video_fragment_id );
this->m_p_obj_phone_video_fragment_model->insertRecord( -1,record );
this->m_p_obj_phone_video_fragment_model->select();
要展示一個blob字段,如上的圖片,我們需要自己子類化一個delegate的paint接口
void CPhoneVideoFragmentDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//列說明:0._id,1.圖片,2.名字,3.底層的視頻碎片id
if(index.column() == 1)
{
auto ba_image = index.model()->data(index).toByteArray();
auto image = QImage::fromData(ba_image);
painter->drawImage(option.rect,image);
} else {
return (QStyledItemDelegate::paint(painter,option,index));
}
return ;
}