2022-08-12 08:03:33 +00:00
|
|
|
|
#include "dialog_imageeditor.h"
|
2022-05-03 10:25:52 +00:00
|
|
|
|
#include "ui_dialog_imageeditor.h"
|
|
|
|
|
#include "graphicsscene.h"
|
|
|
|
|
#include <QColorDialog>
|
2022-08-12 08:03:33 +00:00
|
|
|
|
#include <QResizeEvent>
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2022-10-24 06:36:13 +00:00
|
|
|
|
int m_textSize[] = { 20, 26, 36, 48, 72, 96, 128, 160, 200 };
|
2022-05-03 10:25:52 +00:00
|
|
|
|
int m_lineWidth[] = { 1, 3, 5, 8 };
|
2022-08-12 08:03:33 +00:00
|
|
|
|
float m_scaled[] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 2.5, 4.0, 6.0 };
|
2022-05-03 10:25:52 +00:00
|
|
|
|
Dialog_ImageEditor::Dialog_ImageEditor(QWidget *parent)
|
|
|
|
|
: QDialog(parent)
|
|
|
|
|
, ui(new Ui::Dialog_ImageEditor)
|
|
|
|
|
, m_scene(new GraphicsScene())
|
|
|
|
|
, m_index_scaled(7)
|
2022-08-12 08:03:33 +00:00
|
|
|
|
, m_isFit(true)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
|
|
|
|
|
for (int i = 0; i < ui->comboBox_textSize->count(); i++)
|
|
|
|
|
ui->comboBox_textSize->setItemData(i, m_textSize[i]);
|
|
|
|
|
for (int i = 0; i < ui->comboBox_lineWidth->count(); i++)
|
|
|
|
|
ui->comboBox_lineWidth->setItemData(i, m_lineWidth[i]);
|
|
|
|
|
ui->graphicsView->setScene(m_scene);
|
2022-08-12 08:03:33 +00:00
|
|
|
|
ui->graphicsView->setParent(this);
|
|
|
|
|
ui->btn_color->setStyleSheet("QPushButton{background-color:red;border:1px solid red;}");
|
2022-10-24 06:36:13 +00:00
|
|
|
|
|
|
|
|
|
QColor backgroundColor = qRgb(240, 240, 240);
|
|
|
|
|
ui->graphicsView->setBackgroundBrush(QBrush(backgroundColor));
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dialog_ImageEditor::~Dialog_ImageEditor()
|
|
|
|
|
{
|
|
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::setImage(const QImage &image)
|
|
|
|
|
{
|
|
|
|
|
m_imageSize = image.size();
|
|
|
|
|
m_dpi_x = image.dotsPerMeterX();
|
|
|
|
|
m_dpi_y = image.dotsPerMeterY();
|
|
|
|
|
m_scene->addPixmap(QPixmap::fromImage(image));
|
2022-08-12 08:03:33 +00:00
|
|
|
|
on_btn_fit_clicked();
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QImage Dialog_ImageEditor::exportImage()
|
|
|
|
|
{
|
|
|
|
|
QImage image(m_imageSize, QImage::Format_RGB888);
|
|
|
|
|
image.setDotsPerMeterX(m_dpi_x);
|
|
|
|
|
image.setDotsPerMeterY(m_dpi_y);
|
|
|
|
|
QPainter painter(&image);
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->render(&painter); //<2F>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
|
2022-05-03 10:25:52 +00:00
|
|
|
|
return image;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_rect_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Rect);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->btn_arrow->setChecked(false);
|
|
|
|
|
//ui->btn_rect->setChecked(false);
|
|
|
|
|
ui->btn_ellipse->setChecked(false);
|
|
|
|
|
ui->btn_text->setChecked(false);
|
|
|
|
|
ui->btn_line->setChecked(false);
|
|
|
|
|
ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_ellipse_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Ellipse);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->btn_arrow->setChecked(false);
|
|
|
|
|
ui->btn_rect->setChecked(false);
|
|
|
|
|
//ui->btn_ellipse->setChecked(false);
|
|
|
|
|
ui->btn_text->setChecked(false);
|
|
|
|
|
ui->btn_line->setChecked(false);
|
|
|
|
|
ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_line_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Line);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->btn_arrow->setChecked(false);
|
|
|
|
|
ui->btn_rect->setChecked(false);
|
|
|
|
|
ui->btn_ellipse->setChecked(false);
|
|
|
|
|
ui->btn_text->setChecked(false);
|
|
|
|
|
//ui->btn_line->setChecked(false);
|
|
|
|
|
ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_text_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Text);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->btn_arrow->setChecked(false);
|
|
|
|
|
ui->btn_rect->setChecked(false);
|
|
|
|
|
ui->btn_ellipse->setChecked(false);
|
|
|
|
|
//ui->btn_text->setChecked(false);
|
|
|
|
|
ui->btn_line->setChecked(false);
|
|
|
|
|
ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_arrow_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Arrow);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
//ui->btn_arrow->setChecked(false);
|
|
|
|
|
ui->btn_rect->setChecked(false);
|
|
|
|
|
ui->btn_ellipse->setChecked(false);
|
|
|
|
|
ui->btn_text->setChecked(false);
|
|
|
|
|
ui->btn_line->setChecked(false);
|
|
|
|
|
ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_pen_clicked(bool checked)
|
|
|
|
|
{
|
|
|
|
|
if (checked)
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Pen);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->btn_arrow->setChecked(false);
|
|
|
|
|
ui->btn_rect->setChecked(false);
|
|
|
|
|
ui->btn_ellipse->setChecked(false);
|
|
|
|
|
ui->btn_text->setChecked(false);
|
|
|
|
|
ui->btn_line->setChecked(false);
|
|
|
|
|
//ui->btn_pen->setChecked(false);
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
else
|
|
|
|
|
m_scene->setItemFlag(GraphicsScene::None);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_color_clicked()
|
|
|
|
|
{
|
|
|
|
|
QColorDialog dlg;
|
2022-08-12 08:03:33 +00:00
|
|
|
|
if (!dlg.exec()) return;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2022-08-12 08:03:33 +00:00
|
|
|
|
ui->btn_color->setStyleSheet(QString("QPushButton{background-color:%1;border:1px solid %2}").arg(dlg.selectedColor().name()).arg(dlg.selectedColor().name()));
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_scene->setColor(dlg.selectedColor());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_comboBox_lineWidth_currentIndexChanged(int index)
|
|
|
|
|
{
|
|
|
|
|
m_scene->setLineWidth(ui->comboBox_lineWidth->itemData(index).toInt());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_comboBox_textSize_currentIndexChanged(int index)
|
|
|
|
|
{
|
|
|
|
|
m_scene->setTextSize(ui->comboBox_textSize->itemData(index).toInt());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_undo_clicked()
|
|
|
|
|
{
|
|
|
|
|
m_scene->unDo();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_ok_clicked()
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Normal);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
accept();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_cancel_clicked()
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_scene->setItemFlag(GraphicsScene::Normal);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
reject();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_zoomIn_clicked()
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_isFit = false;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_index_scaled++;
|
|
|
|
|
QTransform tran;
|
|
|
|
|
tran.scale(m_scaled[m_index_scaled], m_scaled[m_index_scaled]);
|
|
|
|
|
ui->graphicsView->setTransform(tran);
|
|
|
|
|
|
|
|
|
|
ui->btn_zoomOut->setEnabled(m_index_scaled > 0);
|
|
|
|
|
ui->btn_zoomIn->setEnabled(m_index_scaled + 1 < sizeof(m_scaled) / sizeof(m_scaled[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_zoomOut_clicked()
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_isFit = false;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_index_scaled--;
|
|
|
|
|
QTransform tran;
|
|
|
|
|
tran.scale(m_scaled[m_index_scaled], m_scaled[m_index_scaled]);
|
|
|
|
|
ui->graphicsView->setTransform(tran);
|
|
|
|
|
|
|
|
|
|
ui->btn_zoomOut->setEnabled(m_index_scaled > 0);
|
|
|
|
|
ui->btn_zoomIn->setEnabled(m_index_scaled + 1 < sizeof(m_scaled) / sizeof(m_scaled[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_zoom_clicked()
|
|
|
|
|
{
|
2022-08-12 08:03:33 +00:00
|
|
|
|
m_isFit = false;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
ui->graphicsView->setTransform(QTransform());
|
|
|
|
|
}
|
2022-08-12 08:03:33 +00:00
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::on_btn_fit_clicked()
|
|
|
|
|
{
|
|
|
|
|
m_isFit = true;
|
|
|
|
|
QSizeF screenSize = ui->graphicsView->size() - QSizeF(5, 5);
|
|
|
|
|
QSizeF imageSize = m_imageSize;
|
|
|
|
|
|
|
|
|
|
float scale_x = screenSize.width() / imageSize.width();
|
|
|
|
|
float scale_y = screenSize.height() / imageSize.height();
|
|
|
|
|
|
|
|
|
|
QTransform tran;
|
|
|
|
|
float scale = scale_x < scale_y ? scale_x : scale_y;
|
|
|
|
|
tran.scale(scale, scale);
|
|
|
|
|
ui->graphicsView->setTransform(tran);
|
|
|
|
|
|
|
|
|
|
m_index_scaled = -1;
|
|
|
|
|
int scaleShiftNum = sizeof(m_scaled) / sizeof(m_scaled[0]);
|
|
|
|
|
for (int i = 0; i < scaleShiftNum; i++)
|
|
|
|
|
if (m_scaled[i] > scale)
|
|
|
|
|
{
|
|
|
|
|
m_index_scaled = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scale > m_scaled[scaleShiftNum - 1])
|
|
|
|
|
m_index_scaled = scaleShiftNum;
|
|
|
|
|
|
|
|
|
|
ui->btn_zoomOut->setEnabled(m_index_scaled > 0);
|
|
|
|
|
ui->btn_zoomIn->setEnabled(m_index_scaled + 1 < scaleShiftNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Dialog_ImageEditor::resizeEvent(QResizeEvent* event)
|
|
|
|
|
{
|
|
|
|
|
if (m_isFit)
|
|
|
|
|
on_btn_fit_clicked();
|
|
|
|
|
|
|
|
|
|
QDialog::resizeEvent(event);
|
|
|
|
|
}
|