學習QT已經一個月了,覺得QT真是個好東西,他的這種跨平台機制簡直太棒了!還有QML這東西,真牛B!在這段學習期間,因為一個項目的需要,需要将圖檔轉成資料,然後傳出去,那邊接收到資料後再對應轉換成圖檔,才有了下面這個小工具,開發環境:QT 4.7.0,在LINUX下面重新編譯也可以在LINUX下面運作,代碼不用改!先放張截圖吧。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauIWMklzNlV2N3ITMmJjZjNmM4UjNxEmNhdjZ5UDOxQmNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
本人比較懶,還是貼出代碼來吧!其中主要就是兩個函數。
void picToData(QString fromPic,QString toData,QString myformat);
void dataToPic(QString fromData,QString toPic,QString myformat); 外加幾個輔助處理函數:QString getFileName(QString filter);//擷取打開對話框中指定格式的檔案QStringList getFileNames(QString filter);//擷取打開對話框中指定格式的檔案清單void delayTime(int s); frmmain.h代碼:
#ifndef FRMMAIN_H
#define FRMMAIN_H
#include QWidget>
#include QtGui>
#include QDrag>
namespace Ui {
class frmmain;
}
class frmmain : public QWidget
{
Q_OBJECT
public:
explicit frmmain(QWidget *parent = 0);
~frmmain();
private:
Ui::frmmain *ui;
private slots:
void on_btnChangeToJpg_clicked();
void on_btnChangeToTxt_clicked();
void on_btnSelectTxt_clicked();
void on_btnSelectFile_clicked();
void on_btnDataToPic_clicked();
void on_btnPicToData_clicked();
void on_btn2_clicked();
void on_btn1_clicked();
void picToData(QString fromPic,QString toData,QString myformat);
void dataToPic(QString fromData,QString toPic,QString myformat);
QString getFileName(QString filter);//擷取打開對話框中指定格式的檔案
QStringList getFileNames(QString filter);//擷取打開對話框中指定格式的檔案清單
void delayTime(int s);
};
#endif // FRMMAIN_H
frmmain.cpp代碼:
#include "frmmain.h"
#include "ui_frmmain.h"
frmmain::frmmain(QWidget *parent) :
QWidget(parent),
ui(new Ui::frmmain)
ui->setupUi(this);
frmmain::~frmmain()
delete ui;
//圖檔轉資料
void frmmain::picToData(QString fromPic, QString toData, QString myformat)
QImage img(fromPic);
QByteArray ba;
QBuffer buf(&ba);
img.save(&buf,"JPG");//按照JPG解碼儲存資料
QByteArray cc=qCompress(ba,1);
QByteArray hh;
if (myformat=="Hex")
{
hh=cc.toHex();//16進制資料
}
else
hh=cc.toBase64();//base64資料
QString str(hh);
QFile file(toData);
if (file.open(QFile::WriteOnly))
file.write(str.toLatin1());
file.close();
//資料轉圖檔
void frmmain::dataToPic(QString fromData, QString toPic, QString myformat)
QFile file(fromData);
if (file.open(QFile::ReadOnly))
QByteArray read=file.readAll();
QString ss=QString::fromLatin1(read.data(),read.size());
QByteArray rc;
if (myformat=="Hex")
{
rc=QByteArray::fromHex(ss.toAscii());
}
else
rc=QByteArray::fromBase64(ss.toAscii());
QByteArray rdc=qUncompress(rc);
QImage img;
img.loadFromData(rdc);
img.save(toPic);
QString frmmain::getFileName(QString filter)
QString fileName;
fileName=QFileDialog::getOpenFileName(this,tr("選擇檔案"),QCoreApplication::applicationDirPath(),filter);
if (!fileName.isEmpty())
return fileName;
return "";
QStringList frmmain::getFileNames(QString filter)
QStringList fileNames;
fileNames=QFileDialog::getOpenFileNames(this,tr("選擇檔案"),QCoreApplication::applicationDirPath(),filter);
if (!fileNames.isEmpty())
return fileNames;
void frmmain::on_btn1_clicked()
ui->pic->setText(this->getFileName(tr("圖檔檔案(*.jpg)")));
void frmmain::on_btn2_clicked()
ui->txt->setText(this->getFileName(tr("文本檔案(*.txt)")));
void frmmain::on_btnPicToData_clicked()
if (ui->pic->text()=="")
QMessageBox::information(this,tr("提示"),tr("請選擇圖檔檔案"));
return;
if (ui->txt->text()=="")
QMessageBox::information(this,tr("提示"),tr("請選擇文本檔案"));
if (ui->rbtn16->isChecked())
this->picToData(ui->pic->text(),ui->txt->text(),"Hex");
this->picToData(ui->pic->text(),ui->txt->text(),"Base64");
void frmmain::on_btnDataToPic_clicked()
this->dataToPic(ui->txt->text(),ui->pic->text(),"Hex");
this->dataToPic(ui->txt->text(),ui->pic->text(),"Base64");
void frmmain::on_btnSelectFile_clicked()
ui->listWidget->addItems(this->getFileNames(tr("圖檔檔案(*.jpg)")));
void frmmain::delayTime(int s)
QTime t=QTime::currentTime().addMSecs(s);
while(QTime::currentTime()t)
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
void frmmain::on_btnSelectTxt_clicked()
ui->listWidget->addItems(this->getFileNames(tr("文本檔案(*.txt)")));
void frmmain::on_btnChangeToTxt_clicked()
QListWidgetItem *myitem;
if (ui->listWidget->count()==0)
for (int i=0;iui->listWidget->count();i++)
QString timeNow=QTime::currentTime().toString("hhmmss");
QString dateNow=QDate::currentDate().toString("yyyyMMdd");
QString saveFileName=QCoreApplication::applicationDirPath()+tr("/imagedata/%1%2.txt").arg(dateNow,timeNow);
myitem=ui->listWidget->item(i);
if (ui->rbtn16->isChecked())
this->picToData(myitem->text(),saveFileName,"Hex");
this->picToData(myitem->text(),saveFileName,"Base64");
this->delayTime(1000);//為了確定命名不沖突和轉換完成,延時1秒
QMessageBox::information(this,tr("提示"),tr("恭喜你!轉換完成!"));
void frmmain::on_btnChangeToJpg_clicked()
QString saveFileName=QCoreApplication::applicationDirPath()+tr("/imageto/%1%2.jpg").arg(dateNow,timeNow);
this->dataToPic(myitem->text(),saveFileName,"Hex");
this->dataToPic(myitem->text(),saveFileName,"Base64");