软件实现
只能打开用这个软件生成的xml文件,因为标签不一样有可能导致错误
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_loadImageBtn_clicked();
void on_saveBtn_clicked();
void on_loadXmlBtn_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QPixmap>
#include <QDebug>
#include <QByteArray>
#include <QBuffer>
#include <QXmlStreamWriter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_loadImageBtn_clicked()
{
QString line;
//file1文件保存的是上一次打开文件的地址
QFile file1("/savefile.txt");
if(file1.open(QIODevice::ReadOnly)) {
QTextStream in(&file1);
line = in.readLine();
}
file1.close();
QString fileName = QFileDialog::getOpenFileName(this,"Open Image",line,tr("Image files(*.png *.jpg *.bmp)"));
//上面的这一部分操作保证的是打开的是上一次的上传的文件
//将这次打开的文件的地址重新写入到保存文件地址的文件中,如果用户没有重新选择就不用保存
if(fileName.isEmpty())//用户没选中文件,接着进行下面的操作就会崩溃,因为s是一个空字符串
return;
if(file1.open((QIODevice::WriteOnly))) {
QTextStream in(&file1);
in<<fileName;
}
file1.close();
QImage *image = new QImage();
if(!image->load(fileName)) {
QMessageBox::information(this,tr("Open Image Failed"),tr("Open Image Failed"));
delete image;
return;
} else {
ui->label->setPixmap(QPixmap::fromImage(*image));
}
}
void MainWindow::on_saveBtn_clicked()
{
const QPixmap *pixmap = ui->label->pixmap();
QImage image = pixmap->toImage();
QByteArray ba;
QBuffer buffer(&ba);
if(!buffer.open(QIODevice::WriteOnly)) {
QMessageBox::information(this,tr("Save Xml"),tr("Save Xml Failed"));
}
//必须指明保存格式
image.save(&buffer,"PNG");
buffer.close();
QByteArray array = ba.toHex();
QString temp = array;
QFile file("my.xml");
if(!file.open(QFile::WriteOnly | QFile::Text))
return;
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument();
stream.writeStartElement("file");
stream.writeTextElement("image",temp);
stream.writeEndElement();
stream.writeEndDocument();
file.close();
}
void MainWindow::on_loadXmlBtn_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,"Open Xml","",tr("Image files(*.xml)"));
QFile file(fileName);
if(!file.open(QFile::ReadOnly | QFile::Text))
return;
QXmlStreamReader reader(&file);
// 如果没有读到文档结尾,而且没有出现错误
while (!reader.atEnd()) {
// 读取下一个记号,它返回记号的类型
QXmlStreamReader::TokenType type = reader.readNext();
if (type == QXmlStreamReader::Characters && !reader.isWhitespace()) {
QPixmap pixmap;
pixmap.loadFromData(QByteArray::fromHex(reader.text().toLatin1()));
ui->label->setPixmap(pixmap);
}
}
}