#include "dialog_imageeditor.h" #include "ui_dialog_imageeditor.h" #include "graphicsscene.h" #include #include 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); //�ؼ����� 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); }