code_app/app/scanner2/dialog_imageeditor.cpp

306 lines
8.5 KiB
C++
Raw Permalink Blame History

#include "dialog_imageeditor.h"
#include "ui_dialog_imageeditor.h"
#include "graphicsscene.h"
#include <QColorDialog>
#include <QResizeEvent>
int m_textSize[] = { 20, 26, 36, 48, 72, 96, 128, 160, 200 };
int m_lineWidth[] = { 1, 3, 5, 8 };
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 };
Dialog_ImageEditor::Dialog_ImageEditor(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog_ImageEditor)
, m_scene(new GraphicsScene())
, m_index_scaled(7)
, m_isFit(true)
{
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]);
m_scene->setColor(QColor("red"));
ui->comboBox_textSize->setCurrentIndex(2);
ui->graphicsView->setScene(m_scene);
ui->graphicsView->setParent(this);
ui->btn_color->setStyleSheet("QPushButton{background-color:red;border:1px solid red;}");
QColor backgroundColor = qRgb(240, 240, 240);
ui->graphicsView->setBackgroundBrush(QBrush(backgroundColor));
connect(m_scene, SIGNAL(itemChanged()), this, SLOT(on_itemChanged()));
ui->btn_undo->setEnabled(m_scene->isCanUndo());
ui->btn_redo->setEnabled(m_scene->isCanRedo());
}
Dialog_ImageEditor::~Dialog_ImageEditor()
{
delete m_scene;
delete ui;
}
void Dialog_ImageEditor::setImage(const QImage &image)
{
m_imageSize = image.size();
m_dpi_x = image.dotsPerMeterX();
m_dpi_y = image.dotsPerMeterY();
QPixmap bitmap = QPixmap::fromImage(image);
m_scene->addPixmap(bitmap);
on_btn_fit_clicked();
}
QImage Dialog_ImageEditor::exportImage()
{
QImage image(m_imageSize, QImage::Format_RGB888);
image.setDotsPerMeterX(m_dpi_x);
image.setDotsPerMeterY(m_dpi_y);
QPainter painter(&image);
m_scene->render(&painter); //<2F>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
return image;
}
void Dialog_ImageEditor::on_itemChanged()
{
ui->btn_undo->setEnabled(m_scene->isCanUndo());
ui->btn_redo->setEnabled(m_scene->isCanRedo());
}
void Dialog_ImageEditor::on_btn_rect_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Rect);
ui->btn_arrow->setChecked(false);
ui->btn_mask->setChecked(false);
ui->btn_ellipse->setChecked(false);
ui->btn_text->setChecked(false);
ui->btn_line->setChecked(false);
ui->btn_pen->setChecked(false);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_ellipse_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Ellipse);
ui->btn_arrow->setChecked(false);
ui->btn_rect->setChecked(false);
ui->btn_mask->setChecked(false);
ui->btn_text->setChecked(false);
ui->btn_line->setChecked(false);
ui->btn_pen->setChecked(false);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_line_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Line);
ui->btn_arrow->setChecked(false);
ui->btn_rect->setChecked(false);
ui->btn_ellipse->setChecked(false);
ui->btn_text->setChecked(false);
ui->btn_mask->setChecked(false);
ui->btn_pen->setChecked(false);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_text_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Text);
ui->btn_arrow->setChecked(false);
ui->btn_rect->setChecked(false);
ui->btn_ellipse->setChecked(false);
ui->btn_mask->setChecked(false);
ui->btn_line->setChecked(false);
ui->btn_pen->setChecked(false);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_arrow_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Arrow);
ui->btn_mask->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);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_pen_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Pen);
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_mask->setChecked(false);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}
void Dialog_ImageEditor::on_btn_color_clicked()
{
QColorDialog dlg(this);
if (!dlg.exec())
return;
ui->btn_color->setStyleSheet(QString("QPushButton{background-color:%1;border:1px solid %2}").arg(dlg.selectedColor().name()).arg(dlg.selectedColor().name()));
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();
ui->btn_undo->setEnabled(m_scene->isCanUndo());
ui->btn_redo->setEnabled(m_scene->isCanRedo());
}
void Dialog_ImageEditor::on_btn_ok_clicked()
{
m_scene->setItemFlag(GraphicsScene::Normal);
accept();
}
void Dialog_ImageEditor::on_btn_cancel_clicked()
{
m_scene->setItemFlag(GraphicsScene::Normal);
reject();
}
void Dialog_ImageEditor::on_btn_zoomIn_clicked()
{
m_isFit = false;
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()
{
m_isFit = false;
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()
{
m_isFit = false;
ui->graphicsView->setTransform(QTransform());
}
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);
}
void Dialog_ImageEditor::on_btn_redo_clicked()
{
m_scene->redo();
ui->btn_undo->setEnabled(m_scene->isCanUndo());
ui->btn_redo->setEnabled(m_scene->isCanRedo());
}
void Dialog_ImageEditor::on_btn_clear_clicked()
{
m_scene->clear();
ui->btn_undo->setEnabled(m_scene->isCanUndo());
ui->btn_redo->setEnabled(m_scene->isCanRedo());
}
void Dialog_ImageEditor::on_btn_mask_clicked(bool checked)
{
if (checked)
{
m_scene->setItemFlag(GraphicsScene::Mask);
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);
}
else
m_scene->setItemFlag(GraphicsScene::None);
}