将图片转化为字符串放入Sqlite数据库,以BLOB类型存储。
一、主要函数
1、图片转字符串
使用内存读写器,指定格式存入字节数组,字节数组转Base64以Latin1编码输出到文本框。
void MainWindow::on_actPtB_triggered()
{
ui->plainTextEdit->clear();
if(ui->labPhoto->pixmap().isNull())
{
labtext->clear();
labtext->setText("图片为空");
return;
}
labtext->setText("转换字符串");
QByteArray byte;
QBuffer buff(&byte);//创建内存读写器
buff.open(QIODevice::WriteOnly);
m_pixmap->save(&buff,"PNG");//指定格式
ui->plainTextEdit->setPlainText(QString::fromLatin1(byte.toBase64()));
}
2、字符串转图片
读取文本框字符串,文本框中存放的字符串,顺序转换格式QString->toLatin1->Base64,Pixmap读取数据(字节数组),最后为QLabel设置图片。
void MainWindow::on_actBtP_triggered()
{
if(ui->plainTextEdit->toPlainText().isEmpty())
{
labtext->clear();
labtext->setText("空文本");
return;
}
ui->labPhoto->clear();
QString str=ui->plainTextEdit->toPlainText();//获取字符串
QByteArray imgData = QByteArray::fromBase64(str.toLatin1());
QPixmap readStrToPhoto;
readStrToPhoto.loadFromData(imgData);
double ratio=static_cast<double>(readStrToPhoto.width())/static_cast<double>(readStrToPhoto.height());//保存比例
//图片大小
int pixWidth=readStrToPhoto.width();
int pixHeight=readStrToPhoto.height();
//组件大小
int boxWidth=ui->groupBoxPhoto->width();
int boxHeight=ui->groupBoxPhoto->height();
if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
{
ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
}
else
{
ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
}
ui->labPhoto->setPixmap(readStrToPhoto);
}
二、UI界面与主函数
界面组件主要有Label和plainTextEdit,另一些Action。
1、构造函数:
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
QLabel* labTitle;
QLabel* labtext;
QPixmap* m_pixmap;
QFileInfo aFileInfo;
private:
void m_PixmapReadPhoto(QString filename);
private slots:
void on_actAddPhoto_triggered();
void on_actPtB_triggered();
void on_actBtP_triggered();
void on_actClearPhoto_triggered();
void on_actCut_triggered();
void on_actCopy_triggered();
void on_actPaste_triggered();
void on_actClearText_triggered();
protected:
void resizeEvent(QResizeEvent* event);
void dragEnterEvent(QDragEnterEvent* event);//拖拽文件进入窗口时触发
void dropEvent(QDropEvent* event);
void dragMoveEvent(QDragMoveEvent *event);
bool eventFileter(QObject* watched,QEvent* event);
private:
Ui::MainWindow *ui;
};
2、主函数:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pixmap=new QPixmap();//初始化指针
ui->labPhoto->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//文本居中
//状态栏初始化
labTitle=new QLabel("文件信息: ",this);
labtext=new QLabel("",this);
ui->statusbar->addWidget(labTitle);
ui->statusbar->addWidget(labtext);
//设置窗口属性
setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);//显示更窄的边框,固定大小
this->setWindowFlags(Qt::CustomizeWindowHint|Qt::WindowMinimizeButtonHint| Qt::WindowCloseButtonHint);//被屏蔽最大化
//设置组件
ui->labPhoto->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);//避免QLabel加载图片时挤压其它空间然后影响整体布局
ui->labPhoto->setScaledContents(true);//图片自适应大小
//Action
QIcon WindowIcon(":/window/window/Title.png");
setWindowIcon(WindowIcon);
QIcon iconOpen(":/Icon/icon/open.png");
QIcon iconToString(":/Icon/icon/toString.png");
QIcon iconToPhoto(":/Icon/icon/toPhoto.png");
QIcon iconCopy(":/Icon/icon/copy.png");
QIcon iconCut(":/Icon/icon/cut.png");
QIcon iconPaste(":/Icon/icon/paste.png");
QIcon iconClearString(":/Icon/icon/clearString.png");
QIcon iconClearPhoto(":/Icon/icon/clearPhoto.png");
ui->actAddPhoto->setIcon(iconOpen);
ui->actPtB->setIcon(iconToString);
ui->actBtP->setIcon(iconToPhoto);
ui->actCopy->setIcon(iconCopy);
ui->actCut->setIcon(iconCut);
ui->actPaste->setIcon(iconPaste);
ui->actClearText->setIcon(iconClearString);
ui->actClearPhoto->setIcon(iconClearPhoto);
ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
//设置拖动属性
// 在构造函数中添加:
setStyleSheet("QMainWindow { border: 2px dashed #aaa; }");
this->setAcceptDrops(true);//窗口接受
ui->centralwidget->setAcceptDrops(false);//中央部件
ui->labPhoto->setAcceptDrops(false);//放置操作由窗口去处理
ui->plainTextEdit->setAcceptDrops(false);
ui->groupBoxPhoto->setAcceptDrops(false);
ui->groupBoxText->setAcceptDrops(false);
}
三、成员函数
1、点击添加按钮,添加文件
void MainWindow::on_actAddPhoto_triggered()
{
QString path=QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);//桌面路径
QString filename=QFileDialog::getOpenFileName(this,"选择一个图片",path,"图片文件(*.jpg *.png);;所有文件(*.*)");
m_PixmapReadPhoto(filename);//自定义函数,更新指针变量
double ratio=static_cast<double>(m_pixmap->width())/static_cast<double>(m_pixmap->height());//保存比例
//图片大小
int pixWidth=m_pixmap->width();
int pixHeight=m_pixmap->height();
//组件大小
int boxWidth=ui->groupBoxPhoto->width();
int boxHeight=ui->groupBoxPhoto->height();
if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
{
ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
}
else
{
ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
}
ui->labPhoto->setPixmap(*m_pixmap);
labtext->clear();
labtext->setText(QString("Name:%1 ; Time: %2").arg(aFileInfo.fileName()).arg(aFileInfo.fileTime(QFileDevice::FileBirthTime).toString()));
qDebug()<<filename<<pixWidth<<pixHeight<<boxWidth<<boxHeight<<ratio;
}
2、拖入文件
setAcceptDrops(true);//开启主窗口放置支持
centralWidget()->setAcceptDrops(false);//防止中间部件拦截事件
dragEnterEvent()//接受拖拽
dropEvent();//放置后的逻辑
his->setAcceptDrops(true);//窗口接受
ui->centralwidget->setAcceptDrops(false);//中央部件
ui->labPhoto->setAcceptDrops(false);//放置操作由窗口去处理
ui->plainTextEdit->setAcceptDrops(false);
ui->groupBoxPhoto->setAcceptDrops(false);
ui->groupBoxText->setAcceptDrops(false);拖拽事件,不起作用时,会显示禁止图标。
AcceptDrops属性默认false,在某些情况下可以不设置,拖入事件:
void MainWindow::dragEnterEvent(QDragEnterEvent *event)//拖拽放入事件
{
for(int i=0;i<event->mimeData()->formats().size();i++)
qDebug()<<event->mimeData()->formats().at(i);
//formats():
//返回对象支持的格式列表。这是一个MIME类型列表,对象可以为其返回合适的数据。列表中的格式按优先级顺序排列。
//对于最常见的数据类型,您可以调用更高级的函数hasText()、hashhtml()、hasUrls()、hasImage()和hasColor()。
for(int i=0;i<event->mimeData()->urls().size();i++)
{
QUrl url=event->mimeData()->urls().at(i);//带路径的文件名
qDebug()<<url.path();
}
if(event->mimeData()->hasUrls())//Returns true if the object can return a list of urls; otherwise returns false.
{
QString filename=event->mimeData()->urls().at(0).fileName();//获取文件名
QFileInfo fileinfo(filename);//文件信息
QString ext=fileinfo.suffix().toUpper();//获取文件后缀
if(ext=="JPG"||ext=="PNG")
event->acceptProposedAction();//接受拖拽操作
else
event->ignore();//忽略事件
}
}
接受放置事件:
void MainWindow::dropEvent(QDropEvent *event)//放置事件
{
qDebug()<<"dropEvent";
QString filename=event->mimeData()->urls().at(0).path();//完整文件名
filename=filename.right(filename.length()-1);//去掉最左边的'/'
m_PixmapReadPhoto(filename);
QPixmap pixmap(filename);
double ratio=static_cast<double>(pixmap.width())/static_cast<double>(pixmap.height());//保存比例
//图片大小
int pixWidth=pixmap.width();
int pixHeight=pixmap.height();
//组件大小
int boxHeight=ui->groupBoxPhoto->height();
if(ui->groupBoxPhoto->width()>pixWidth &&ui->groupBoxPhoto->height()>pixHeight)
{
ui->labPhoto->setMaximumSize(QSize(pixWidth,pixHeight));
ui->labPhoto->setMinimumSize(QSize(pixWidth,pixHeight));
}
else
{
ui->labPhoto->setMaximumSize(QSize(boxHeight*ratio,boxHeight));
ui->labPhoto->setMinimumSize(QSize(boxHeight*ratio,boxHeight));
}
ui->labPhoto->setPixmap(pixmap);
event->accept();
}
3、自定义函数,更新成员变量m_pixmap
void MainWindow::m_PixmapReadPhoto(QString filename)
{
aFileInfo=QFileInfo(filename);//获取文件信息
m_pixmap=new QPixmap(filename);
if(m_pixmap->isNull())
{
QImageReader reader;
QImage image;
reader.setDecideFormatFromContent(true);
reader.setScaledSize(QSize(width(), height()));
reader.setFileName(filename);
if (reader.canRead())//避免文件太大,第一种方式读取文件失败的情况
{
if (!reader.read(&image))
{
QImageReader::ImageReaderError error = reader.error();
QString strError = reader.errorString();
printf("last error:%s\n", strError.toStdString().c_str());
return;
}
}
*m_pixmap=QPixmap::fromImage(image);//读取图片资源
}
}
四、测试
1、转换
2、放入数据库
3、查看