|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 29 KiB |
@ -0,0 +1,16 @@
|
|||||||
|
QT += core gui
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||||
|
|
||||||
|
TARGET = astackwidget
|
||||||
|
TEMPLATE = app
|
||||||
|
DESTDIR = $$PWD/../bin
|
||||||
|
CONFIG += warn_off
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
|
SOURCES += astackwidget.cpp
|
||||||
|
HEADERS += astackwidget.h
|
||||||
|
|
||||||
|
SOURCES += frmastackwidget.cpp
|
||||||
|
HEADERS += frmastackwidget.h
|
||||||
|
FORMS += frmastackwidget.ui
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FrmAStackWidgetClass</class>
|
||||||
|
<widget class="QWidget" name="FrmAStackWidgetClass">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>400</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>FrmAStackWidget</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_1">
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton2</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton3</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton4</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton5</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="AStackWidget" name="aStackwidget" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>AStackWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>astackwidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 326 KiB |
|
After Width: | Height: | Size: 197 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 197 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 502 KiB |
|
After Width: | Height: | Size: 329 KiB |
@ -0,0 +1,99 @@
|
|||||||
|
#ifndef IMAGECROPPER_H
|
||||||
|
#define IMAGECROPPER_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QString>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
#include "imagecropperlabel.h"
|
||||||
|
|
||||||
|
/*******************************************************
|
||||||
|
* Loacl private class, which do image-cropping
|
||||||
|
* Used in class ImageCropper
|
||||||
|
*******************************************************/
|
||||||
|
class ImageCropperDialogPrivate : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
ImageCropperDialogPrivate(const QPixmap &imageIn, QPixmap &outputImage,
|
||||||
|
int windowWidth, int windowHeight,
|
||||||
|
CropperShape shape, QSize cropperSize = QSize())
|
||||||
|
: QDialog(0)
|
||||||
|
, outputImage(outputImage)
|
||||||
|
{
|
||||||
|
this->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
this->setWindowTitle("Image Cropper");
|
||||||
|
this->setMouseTracking(true);
|
||||||
|
this->setModal(true);
|
||||||
|
|
||||||
|
imageLabel = new ImageCropperLabel(windowWidth, windowHeight, this);
|
||||||
|
imageLabel->setCropper(shape, cropperSize);
|
||||||
|
imageLabel->setOutputShape(OutputShape::RECT);
|
||||||
|
imageLabel->setOriginalImage(imageIn);
|
||||||
|
imageLabel->enableOpacity(true);
|
||||||
|
|
||||||
|
QHBoxLayout *btnLayout = new QHBoxLayout();
|
||||||
|
btnOk = new QPushButton("OK", this);
|
||||||
|
btnCancel = new QPushButton("Cancel", this);
|
||||||
|
btnLayout->addStretch();
|
||||||
|
btnLayout->addWidget(btnOk);
|
||||||
|
btnLayout->addWidget(btnCancel);
|
||||||
|
|
||||||
|
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
||||||
|
mainLayout->addWidget(imageLabel);
|
||||||
|
mainLayout->addLayout(btnLayout);
|
||||||
|
|
||||||
|
connect(btnOk, &QPushButton::clicked, this, [this]() {
|
||||||
|
this->outputImage = this->imageLabel->getCroppedImage();
|
||||||
|
this->close();
|
||||||
|
});
|
||||||
|
connect(btnCancel, &QPushButton::clicked, this, [this]() {
|
||||||
|
this->outputImage = QPixmap();
|
||||||
|
this->close();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImageCropperLabel *imageLabel;
|
||||||
|
QPushButton *btnOk;
|
||||||
|
QPushButton *btnCancel;
|
||||||
|
QPixmap &outputImage;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* class ImageCropperDialog
|
||||||
|
* create a instane of class ImageCropperDialogPrivate
|
||||||
|
* and get cropped image from the instance(after closing)
|
||||||
|
********************************************************************/
|
||||||
|
class ImageCropperDialog : QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static QPixmap getCroppedImage(const QString &filename, int windowWidth, int windowHeight,
|
||||||
|
CropperShape cropperShape, QSize crooperSize = QSize())
|
||||||
|
{
|
||||||
|
QPixmap inputImage;
|
||||||
|
QPixmap outputImage;
|
||||||
|
|
||||||
|
if (!inputImage.load(filename)) {
|
||||||
|
QMessageBox::critical(0, "Error", "Load image failed!", QMessageBox::Ok);
|
||||||
|
return outputImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageCropperDialogPrivate *imageCropperDo =
|
||||||
|
new ImageCropperDialogPrivate(inputImage, outputImage,
|
||||||
|
windowWidth, windowHeight,
|
||||||
|
cropperShape, crooperSize);
|
||||||
|
imageCropperDo->exec();
|
||||||
|
|
||||||
|
return outputImage;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // IMAGECROPPER_H
|
||||||
@ -0,0 +1,415 @@
|
|||||||
|
#include "imagecropperdemo.h"
|
||||||
|
#include <QFormLayout>
|
||||||
|
#include <QColorDialog>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
ImageCropperDemo::ImageCropperDemo(QWidget* parent) :
|
||||||
|
QDialog(parent)
|
||||||
|
{
|
||||||
|
setupLayout();
|
||||||
|
init();
|
||||||
|
|
||||||
|
this->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
this->setWindowTitle("Image Cropper Demo");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ImageCropperDemo::setupLayout() {
|
||||||
|
imgCropperLabel = new ImageCropperLabel(600, 500, this);
|
||||||
|
imgCropperLabel->setFrameStyle(1);
|
||||||
|
|
||||||
|
comboOutputShape = new QComboBox(this);
|
||||||
|
comboCropperShape = new QComboBox(this);
|
||||||
|
|
||||||
|
labelPreviewImage = new QLabel(this);
|
||||||
|
|
||||||
|
editOriginalImagePath = new QLineEdit(this);
|
||||||
|
btnChooseOriginalImagePath = new QPushButton(this);
|
||||||
|
QHBoxLayout* hOriginalImagePathLayout = new QHBoxLayout();
|
||||||
|
hOriginalImagePathLayout->addWidget(editOriginalImagePath);
|
||||||
|
hOriginalImagePathLayout->addWidget(btnChooseOriginalImagePath);
|
||||||
|
|
||||||
|
editCropperFixedWidth = new QLineEdit(this);
|
||||||
|
editCropperFixedHeight = new QLineEdit(this);
|
||||||
|
QHBoxLayout* hCropperFixedSizeLayout = new QHBoxLayout();
|
||||||
|
hCropperFixedSizeLayout->addWidget(editCropperFixedWidth);
|
||||||
|
hCropperFixedSizeLayout->addWidget(editCropperFixedHeight);
|
||||||
|
|
||||||
|
editCropperMinWidth = new QLineEdit("8", this);
|
||||||
|
editCropperMinHeight = new QLineEdit("8", this);
|
||||||
|
QHBoxLayout* hCropperMinSizeLayout = new QHBoxLayout();
|
||||||
|
hCropperMinSizeLayout->addWidget(editCropperMinWidth);
|
||||||
|
hCropperMinSizeLayout->addWidget(editCropperMinHeight);
|
||||||
|
|
||||||
|
checkEnableOpacity = new QCheckBox(this);
|
||||||
|
sliderOpacity = new QSlider(Qt::Horizontal, this);
|
||||||
|
|
||||||
|
checkShowDragSquare = new QCheckBox(this);
|
||||||
|
editDragSquareEdge = new QLineEdit("8", this);
|
||||||
|
checkShowRectBorder = new QCheckBox(this);
|
||||||
|
|
||||||
|
labelRectBorderColor = new QLabel(this);
|
||||||
|
btnChooseRectBorderCorlor = new QPushButton(this);
|
||||||
|
QHBoxLayout* hRectBorderColorLayout = new QHBoxLayout();
|
||||||
|
hRectBorderColorLayout->addWidget(labelRectBorderColor);
|
||||||
|
hRectBorderColorLayout->addWidget(btnChooseRectBorderCorlor);
|
||||||
|
|
||||||
|
labelDragSquareColor = new QLabel(this);
|
||||||
|
btnChooseDragSquareColor = new QPushButton(this);
|
||||||
|
QHBoxLayout* hDragSquareColorLayout = new QHBoxLayout();
|
||||||
|
hDragSquareColorLayout->addWidget(labelDragSquareColor);
|
||||||
|
hDragSquareColorLayout->addWidget(btnChooseDragSquareColor);
|
||||||
|
|
||||||
|
QFormLayout* formLayout1 = new QFormLayout();
|
||||||
|
formLayout1->addRow(new QLabel("Preview:"), labelPreviewImage);
|
||||||
|
formLayout1->addRow(new QLabel("OriginalImage:", this), hOriginalImagePathLayout);
|
||||||
|
formLayout1->addRow(new QLabel("OutputShape:", this), comboOutputShape);
|
||||||
|
formLayout1->addRow(new QLabel("CropperShape:", this), comboCropperShape);
|
||||||
|
formLayout1->addRow(new QLabel("FixedSize:", this), hCropperFixedSizeLayout);
|
||||||
|
formLayout1->addRow(new QLabel("MinimumSize:", this), hCropperMinSizeLayout);
|
||||||
|
|
||||||
|
QFormLayout* formLayout2 = new QFormLayout();
|
||||||
|
formLayout2->addRow(new QLabel("EnableOpacity:", this), checkEnableOpacity);
|
||||||
|
formLayout2->addRow(new QLabel("Opacity:", this), sliderOpacity);
|
||||||
|
|
||||||
|
QFormLayout* formLayout3 = new QFormLayout();
|
||||||
|
formLayout3->addRow(new QLabel("ShowDragSquare:", this), checkShowDragSquare);
|
||||||
|
formLayout3->addRow(new QLabel("DragSquareEdge:", this), editDragSquareEdge);
|
||||||
|
formLayout3->addRow(new QLabel("DragSquareColor:", this), hDragSquareColorLayout);
|
||||||
|
|
||||||
|
QFormLayout* formLayout4 = new QFormLayout();
|
||||||
|
formLayout4->addRow(new QLabel("ShowRectBorder:", this), checkShowRectBorder);
|
||||||
|
formLayout4->addRow(new QLabel("RectBorderColor:", this), hRectBorderColorLayout);
|
||||||
|
|
||||||
|
btnSavePreview = new QPushButton("Save", this);
|
||||||
|
btnQuit = new QPushButton("Quit", this);
|
||||||
|
QHBoxLayout* btnLayout = new QHBoxLayout();
|
||||||
|
btnLayout->addStretch();
|
||||||
|
btnLayout->addWidget(btnSavePreview);
|
||||||
|
btnLayout->addStretch();
|
||||||
|
btnLayout->addWidget(btnQuit);
|
||||||
|
btnLayout->addStretch();
|
||||||
|
|
||||||
|
QVBoxLayout* vLayout = new QVBoxLayout();
|
||||||
|
vLayout->addLayout(formLayout1);
|
||||||
|
vLayout->addStretch();
|
||||||
|
vLayout->addLayout(formLayout2);
|
||||||
|
vLayout->addStretch();
|
||||||
|
vLayout->addLayout(formLayout3);
|
||||||
|
vLayout->addStretch();
|
||||||
|
vLayout->addLayout(formLayout4);
|
||||||
|
vLayout->addStretch();
|
||||||
|
vLayout->addLayout(btnLayout);
|
||||||
|
|
||||||
|
mainLayout = new QHBoxLayout(this);
|
||||||
|
mainLayout->addWidget(imgCropperLabel);
|
||||||
|
mainLayout->addLayout(vLayout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::init() {
|
||||||
|
imgCropperLabel->setRectCropper();
|
||||||
|
editCropperFixedWidth->setEnabled(false);
|
||||||
|
editCropperFixedHeight->setEnabled(false);
|
||||||
|
|
||||||
|
labelPreviewImage->setFixedSize(96, 96);
|
||||||
|
labelPreviewImage->setAlignment(Qt::AlignCenter);
|
||||||
|
labelPreviewImage->setFrameStyle(QFrame::Panel | QFrame::Sunken);
|
||||||
|
connect(imgCropperLabel, &ImageCropperLabel::croppedImageChanged,
|
||||||
|
this, &ImageCropperDemo::onUpdatePreview);
|
||||||
|
|
||||||
|
btnChooseOriginalImagePath->setIcon(QIcon("res/select-file.ico"));
|
||||||
|
btnChooseOriginalImagePath->setFixedWidth(30);
|
||||||
|
connect(btnChooseOriginalImagePath, &QPushButton::clicked,
|
||||||
|
this, &ImageCropperDemo::onChooseOriginalImage);
|
||||||
|
|
||||||
|
comboOutputShape->addItem("Rect/Square");
|
||||||
|
comboOutputShape->addItem("Ellipse/Circle");
|
||||||
|
connect(comboOutputShape, SIGNAL(currentIndexChanged(int)),
|
||||||
|
this, SLOT(onOutputShapeChanged(int)));
|
||||||
|
|
||||||
|
comboCropperShape->addItem("Rect");
|
||||||
|
comboCropperShape->addItem("Square");
|
||||||
|
comboCropperShape->addItem("FixedRect");
|
||||||
|
comboCropperShape->addItem("Ellipse");
|
||||||
|
comboCropperShape->addItem("Circle");
|
||||||
|
comboCropperShape->addItem("FixedEllipse");
|
||||||
|
connect(comboCropperShape, SIGNAL(currentIndexChanged(int)),
|
||||||
|
this, SLOT(onCropperShapeChanged(int)));
|
||||||
|
|
||||||
|
connect(editCropperFixedWidth, &QLineEdit::textChanged,
|
||||||
|
this, &ImageCropperDemo::onFixedWidthChanged);
|
||||||
|
connect(editCropperFixedHeight, &QLineEdit::textChanged,
|
||||||
|
this, &ImageCropperDemo::onFixedHeightChanged);
|
||||||
|
connect(editCropperMinWidth, &QLineEdit::textChanged,
|
||||||
|
this, &ImageCropperDemo::onMinWidthChanged);
|
||||||
|
connect(editCropperMinHeight, &QLineEdit::textChanged,
|
||||||
|
this, &ImageCropperDemo::onMinHeightChanged);
|
||||||
|
|
||||||
|
checkEnableOpacity->setCheckState(Qt::Checked);
|
||||||
|
imgCropperLabel->enableOpacity(true);
|
||||||
|
connect(checkEnableOpacity, &QCheckBox::stateChanged,
|
||||||
|
this, &ImageCropperDemo::onEnableOpacityChanged);
|
||||||
|
|
||||||
|
checkShowDragSquare->setCheckState(Qt::Checked);
|
||||||
|
imgCropperLabel->setShowDragSquare(true);
|
||||||
|
connect(checkShowDragSquare, &QCheckBox::stateChanged,
|
||||||
|
this, &ImageCropperDemo::onShowDragSquareChanged);
|
||||||
|
connect(editDragSquareEdge, &QLineEdit::textChanged,
|
||||||
|
this, &ImageCropperDemo::onDragSquareEdgeChanged);
|
||||||
|
|
||||||
|
sliderOpacity->setRange(0, 100);
|
||||||
|
sliderOpacity->setValue(60);
|
||||||
|
connect(sliderOpacity, &QSlider::valueChanged,
|
||||||
|
this, &ImageCropperDemo::onOpacityChanged);
|
||||||
|
|
||||||
|
checkShowRectBorder->setCheckState(Qt::Checked);
|
||||||
|
connect(checkShowRectBorder, &QCheckBox::stateChanged,
|
||||||
|
this, &ImageCropperDemo::onShowRectBorder);
|
||||||
|
|
||||||
|
setLabelColor(labelRectBorderColor, Qt::white);
|
||||||
|
btnChooseRectBorderCorlor->setIcon(QIcon("res/color-palette.ico"));
|
||||||
|
btnChooseRectBorderCorlor->setFixedWidth(40);
|
||||||
|
connect(btnChooseRectBorderCorlor, &QPushButton::clicked,
|
||||||
|
this, &ImageCropperDemo::onChooseRectBorderColor);
|
||||||
|
|
||||||
|
setLabelColor(labelDragSquareColor, Qt::white);
|
||||||
|
btnChooseDragSquareColor->setIcon(QIcon("res/color-palette.ico"));
|
||||||
|
btnChooseDragSquareColor->setFixedWidth(40);
|
||||||
|
connect(btnChooseDragSquareColor, &QPushButton::clicked,
|
||||||
|
this, &ImageCropperDemo::onChooseDragSquareColor);
|
||||||
|
|
||||||
|
connect(btnSavePreview, &QPushButton::clicked,
|
||||||
|
this, &ImageCropperDemo::onSaveCroppedImage);
|
||||||
|
connect(btnQuit, &QPushButton::clicked,
|
||||||
|
this, &ImageCropperDemo::close);
|
||||||
|
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
*
|
||||||
|
* slots
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
void ImageCropperDemo::onChooseOriginalImage() {
|
||||||
|
QString filename = QFileDialog::getOpenFileName(this, "Select a picture", "",
|
||||||
|
"picture (*.jpg *.png *.bmp)");
|
||||||
|
if (filename.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QPixmap pixmap;
|
||||||
|
if (!pixmap.load(filename)) {
|
||||||
|
QMessageBox::critical(this, "Error", "Load image failed", QMessageBox::Ok);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
editOriginalImagePath->setText(filename);
|
||||||
|
imgCropperLabel->setOriginalImage(pixmap);
|
||||||
|
imgCropperLabel->update();
|
||||||
|
onUpdatePreview();
|
||||||
|
labelPreviewImage->setFrameStyle(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onOutputShapeChanged(int idx) {
|
||||||
|
// Output: Rectangular
|
||||||
|
if (idx == 0)
|
||||||
|
imgCropperLabel->setOutputShape(OutputShape::RECT);
|
||||||
|
else
|
||||||
|
imgCropperLabel->setOutputShape(OutputShape::ELLIPSE);
|
||||||
|
onUpdatePreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onCropperShapeChanged(int idx) {
|
||||||
|
switch (CropperShape(idx + 1)) {
|
||||||
|
case CropperShape::RECT: {
|
||||||
|
imgCropperLabel->setRectCropper();
|
||||||
|
editCropperFixedWidth->setEnabled(false);
|
||||||
|
editCropperFixedHeight->setEnabled(false);
|
||||||
|
editCropperMinWidth->setEnabled(true);
|
||||||
|
editCropperMinHeight->setEnabled(true);
|
||||||
|
checkShowDragSquare->setEnabled(true);
|
||||||
|
editDragSquareEdge->setEnabled(true);
|
||||||
|
btnChooseDragSquareColor->setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CropperShape::SQUARE: {
|
||||||
|
imgCropperLabel->setSquareCropper();
|
||||||
|
editCropperFixedWidth->setEnabled(false);
|
||||||
|
editCropperFixedHeight->setEnabled(false);
|
||||||
|
editCropperMinWidth->setEnabled(true);
|
||||||
|
editCropperMinHeight->setEnabled(true);
|
||||||
|
checkShowDragSquare->setEnabled(true);
|
||||||
|
editDragSquareEdge->setEnabled(true);
|
||||||
|
btnChooseDragSquareColor->setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CropperShape::FIXED_RECT: {
|
||||||
|
imgCropperLabel->setFixedRectCropper(QSize(64, 64));
|
||||||
|
editCropperFixedWidth->setEnabled(true);
|
||||||
|
editCropperFixedHeight->setEnabled(true);
|
||||||
|
editCropperMinWidth->setEnabled(false);
|
||||||
|
editCropperMinHeight->setEnabled(false);
|
||||||
|
editCropperFixedWidth->setText("64");
|
||||||
|
editCropperFixedHeight->setText("64");
|
||||||
|
checkShowDragSquare->setEnabled(false);
|
||||||
|
editDragSquareEdge->setEnabled(false);
|
||||||
|
btnChooseDragSquareColor->setEnabled(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CropperShape::ELLIPSE: {
|
||||||
|
imgCropperLabel->setEllipseCropper();
|
||||||
|
editCropperFixedWidth->setEnabled(false);
|
||||||
|
editCropperFixedHeight->setEnabled(false);
|
||||||
|
editCropperMinWidth->setEnabled(true);
|
||||||
|
editCropperMinHeight->setEnabled(true);
|
||||||
|
checkShowDragSquare->setEnabled(true);
|
||||||
|
editDragSquareEdge->setEnabled(true);
|
||||||
|
btnChooseDragSquareColor->setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CropperShape::CIRCLE: {
|
||||||
|
imgCropperLabel->setCircleCropper();
|
||||||
|
editCropperFixedWidth->setEnabled(false);
|
||||||
|
editCropperFixedHeight->setEnabled(false);
|
||||||
|
editCropperMinWidth->setEnabled(true);
|
||||||
|
editCropperMinHeight->setEnabled(true);
|
||||||
|
checkShowDragSquare->setEnabled(true);
|
||||||
|
editDragSquareEdge->setEnabled(true);
|
||||||
|
btnChooseDragSquareColor->setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CropperShape::FIXED_ELLIPSE:
|
||||||
|
imgCropperLabel->setFixedEllipseCropper(QSize(64, 64));
|
||||||
|
editCropperFixedWidth->setEnabled(true);
|
||||||
|
editCropperFixedHeight->setEnabled(true);
|
||||||
|
editCropperMinWidth->setEnabled(false);
|
||||||
|
editCropperMinHeight->setEnabled(false);
|
||||||
|
editCropperFixedWidth->setText("64");
|
||||||
|
editCropperFixedHeight->setText("64");
|
||||||
|
checkShowDragSquare->setEnabled(false);
|
||||||
|
editDragSquareEdge->setEnabled(false);
|
||||||
|
btnChooseDragSquareColor->setEnabled(false);
|
||||||
|
break;
|
||||||
|
case CropperShape::UNDEFINED:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
imgCropperLabel->update();
|
||||||
|
onUpdatePreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onEnableOpacityChanged(int state) {
|
||||||
|
if (state == Qt::Checked) {
|
||||||
|
sliderOpacity->setEnabled(true);
|
||||||
|
imgCropperLabel->enableOpacity(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sliderOpacity->setEnabled(false);
|
||||||
|
imgCropperLabel->enableOpacity(false);
|
||||||
|
}
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onShowDragSquareChanged(int state) {
|
||||||
|
if (state == Qt::Checked) {
|
||||||
|
editDragSquareEdge->setEnabled(true);
|
||||||
|
btnChooseDragSquareColor->setEnabled(true);
|
||||||
|
imgCropperLabel->setShowDragSquare(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
editDragSquareEdge->setEnabled(false);
|
||||||
|
btnChooseDragSquareColor->setEnabled(false);
|
||||||
|
imgCropperLabel->setShowDragSquare(false);
|
||||||
|
}
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onDragSquareEdgeChanged(QString edge) {
|
||||||
|
imgCropperLabel->setDragSquareEdge(edge.toInt());
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onOpacityChanged(int val) {
|
||||||
|
imgCropperLabel->setOpacity(val / 100.0);
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onFixedWidthChanged(QString width) {
|
||||||
|
imgCropperLabel->setCropperFixedWidth(width.toInt());
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onFixedHeightChanged(QString height) {
|
||||||
|
imgCropperLabel->setCropperFixedHeight(height.toInt());
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onMinWidthChanged(QString width) {
|
||||||
|
imgCropperLabel->setCropperMinimumWidth(width.toInt());
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onMinHeightChanged(QString height) {
|
||||||
|
imgCropperLabel->setMinimumHeight(height.toInt());
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onShowRectBorder(int state) {
|
||||||
|
if (state == Qt::Checked) {
|
||||||
|
btnChooseRectBorderCorlor->setEnabled(true);
|
||||||
|
imgCropperLabel->setShowRectBorder(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
btnChooseRectBorderCorlor->setEnabled(false);
|
||||||
|
imgCropperLabel->setShowRectBorder(false);
|
||||||
|
}
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onChooseRectBorderColor() {
|
||||||
|
QColor color = QColorDialog::getColor(imgCropperLabel->getBorderPen().color(), this);
|
||||||
|
if (color.isValid()) {
|
||||||
|
setLabelColor(labelRectBorderColor, color);
|
||||||
|
QPen pen = imgCropperLabel->getBorderPen();
|
||||||
|
pen.setColor(color);
|
||||||
|
imgCropperLabel->setBorderPen(pen);
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onChooseDragSquareColor() {
|
||||||
|
QColor color = QColorDialog::getColor(Qt::white, this);
|
||||||
|
if (color.isValid()) {
|
||||||
|
setLabelColor(labelDragSquareColor, color);
|
||||||
|
imgCropperLabel->setDragSquareColor(color);
|
||||||
|
imgCropperLabel->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onUpdatePreview() {
|
||||||
|
QPixmap preview = imgCropperLabel->getCroppedImage();
|
||||||
|
preview = preview.scaled(labelPreviewImage->width(), labelPreviewImage->height(),
|
||||||
|
Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
labelPreviewImage->setPixmap(preview);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageCropperDemo::onSaveCroppedImage() {
|
||||||
|
const QPixmap* pixmap = labelPreviewImage->pixmap();
|
||||||
|
if (!pixmap) {
|
||||||
|
QMessageBox::information(this, "Error", "There is no cropped image to save.", QMessageBox::Ok);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString filename = QFileDialog::getSaveFileName(this, "Save cropped image", "", "picture (*.png)");
|
||||||
|
if (!filename.isNull()) {
|
||||||
|
if (imgCropperLabel->getCroppedImage().save(filename, "PNG"))
|
||||||
|
QMessageBox::information(this, "Prompt", "Saved successfully", QMessageBox::Ok);
|
||||||
|
else
|
||||||
|
QMessageBox::information(this, "Error", "Save image failed!", QMessageBox::Ok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
#ifndef TESTIMAGECROPPERLABEL_H
|
||||||
|
#define TESTIMAGECROPPERLABEL_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QSlider>
|
||||||
|
|
||||||
|
#include "../base/imagecropperlabel.h"
|
||||||
|
|
||||||
|
class ImageCropperDemo : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
ImageCropperDemo(QWidget* parent = 0);
|
||||||
|
|
||||||
|
void setupLayout();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onOutputShapeChanged(int idx);
|
||||||
|
void onCropperShapeChanged(int idx);
|
||||||
|
void onEnableOpacityChanged(int state);
|
||||||
|
void onShowDragSquareChanged(int state);
|
||||||
|
void onDragSquareEdgeChanged(QString edge);
|
||||||
|
void onOpacityChanged(int val);
|
||||||
|
void onFixedWidthChanged(QString width);
|
||||||
|
void onFixedHeightChanged(QString height);
|
||||||
|
void onMinWidthChanged(QString width);
|
||||||
|
void onMinHeightChanged(QString height);
|
||||||
|
void onShowRectBorder(int state);
|
||||||
|
void onChooseRectBorderColor();
|
||||||
|
void onChooseDragSquareColor();
|
||||||
|
|
||||||
|
void onChooseOriginalImage();
|
||||||
|
void onUpdatePreview();
|
||||||
|
void onSaveCroppedImage();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setLabelColor(QLabel* label, QColor color) {
|
||||||
|
QPixmap pixmap(QSize(80, 25));
|
||||||
|
pixmap.fill(color);
|
||||||
|
label->setPixmap(pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImageCropperLabel* imgCropperLabel;
|
||||||
|
QHBoxLayout* mainLayout;
|
||||||
|
|
||||||
|
QLabel* labelPreviewImage;
|
||||||
|
|
||||||
|
QComboBox* comboOutputShape;
|
||||||
|
QComboBox* comboCropperShape;
|
||||||
|
|
||||||
|
QLineEdit* editOriginalImagePath;
|
||||||
|
QPushButton* btnChooseOriginalImagePath;
|
||||||
|
|
||||||
|
QLineEdit* editCropperFixedWidth;
|
||||||
|
QLineEdit* editCropperFixedHeight;
|
||||||
|
QLineEdit* editCropperMinWidth;
|
||||||
|
QLineEdit* editCropperMinHeight;
|
||||||
|
|
||||||
|
QCheckBox* checkShowDragSquare;
|
||||||
|
QCheckBox* checkEnableOpacity;
|
||||||
|
QSlider* sliderOpacity;
|
||||||
|
QLineEdit* editDragSquareEdge;
|
||||||
|
|
||||||
|
QCheckBox* checkShowRectBorder;
|
||||||
|
QLabel* labelRectBorderColor;
|
||||||
|
QPushButton* btnChooseRectBorderCorlor;
|
||||||
|
|
||||||
|
QLabel* labelDragSquareColor;
|
||||||
|
QPushButton* btnChooseDragSquareColor;
|
||||||
|
|
||||||
|
QPushButton* btnSavePreview;
|
||||||
|
QPushButton* btnQuit;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TESTIMAGECROPPERLABEL_H
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
MainWindow w;
|
||||||
|
w.show();
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
#include "imagecropperdemo.h"
|
||||||
|
|
||||||
|
#include "../base/imagecropperdialog.h"
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
|
: QMainWindow(parent)
|
||||||
|
{
|
||||||
|
setupLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupLayout() {
|
||||||
|
QWidget* centralWidget = new QWidget(this);
|
||||||
|
|
||||||
|
btnCustomCrop = new QPushButton("Custom Crop", centralWidget);
|
||||||
|
btnSimpleCrop = new QPushButton("Simple Crop", centralWidget);
|
||||||
|
|
||||||
|
QVBoxLayout* mainLayout = new QVBoxLayout(centralWidget);
|
||||||
|
mainLayout->addWidget(btnCustomCrop);
|
||||||
|
mainLayout->addWidget(btnSimpleCrop);
|
||||||
|
this->setCentralWidget(centralWidget);
|
||||||
|
|
||||||
|
connect(btnCustomCrop, &QPushButton::clicked, this, &MainWindow::onCustomCrop);
|
||||||
|
connect(btnSimpleCrop, &QPushButton::clicked, this, &MainWindow::onSimpleCrop);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onCustomCrop() {
|
||||||
|
ImageCropperDemo* dialog = new ImageCropperDemo(this);
|
||||||
|
dialog->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onSimpleCrop() {
|
||||||
|
QMessageBox::information(this, "Prompt", "Please select a picture", QMessageBox::Ok);
|
||||||
|
QString filename = QFileDialog::getOpenFileName(this, "Select image", "", "image (*.png *.jpg)");
|
||||||
|
if (filename.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// *********
|
||||||
|
// *******
|
||||||
|
// *****
|
||||||
|
// ***
|
||||||
|
// *
|
||||||
|
QPixmap image = ImageCropperDialog::getCroppedImage(filename, 600, 400, CropperShape::CIRCLE);
|
||||||
|
if (image.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QDialog* dialog = new QDialog(0);
|
||||||
|
dialog->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
QLabel* label = new QLabel(dialog);
|
||||||
|
label->setFixedSize(image.size());
|
||||||
|
label->setPixmap(image);
|
||||||
|
dialog->exec();
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MainWindow(QWidget *parent = 0);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onCustomCrop();
|
||||||
|
void onSimpleCrop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupLayout();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPushButton* btnCustomCrop;
|
||||||
|
QPushButton* btnSimpleCrop;
|
||||||
|
};
|
||||||
|
#endif // MAINWINDOW_H
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
QT += core gui
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||||
|
|
||||||
|
TEMPLATE = app
|
||||||
|
DESTDIR = $$PWD/../bin
|
||||||
|
CONFIG += warn_off
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
base/imagecropperlabel.cpp \
|
||||||
|
example/imagecropperdemo.cpp \
|
||||||
|
example/main.cpp \
|
||||||
|
example/mainwindow.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
base/imagecropperdialog.h \
|
||||||
|
base/imagecropperlabel.h \
|
||||||
|
example/imagecropperdemo.h \
|
||||||
|
example/mainwindow.h
|
||||||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 332 B |
|
After Width: | Height: | Size: 349 B |
@ -0,0 +1,59 @@
|
|||||||
|
#include "graphicspixmap.h"
|
||||||
|
|
||||||
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
GraphicsPixmap::GraphicsPixmap() : QGraphicsObject()
|
||||||
|
{
|
||||||
|
setCacheMode(DeviceCoordinateCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
QGraphicsObject::mousePressEvent(event);
|
||||||
|
if (event->button() == Qt::LeftButton)
|
||||||
|
{
|
||||||
|
emit clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsPixmap::setItemOffset(QPointF ponit)
|
||||||
|
{
|
||||||
|
prepareGeometryChange();
|
||||||
|
offset = ponit;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF GraphicsPixmap::itemoffset()
|
||||||
|
{
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsPixmap::setPixmap(const QPixmap& pixmap)
|
||||||
|
{
|
||||||
|
pixSize = pixmap.size();
|
||||||
|
pix = pixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsPixmap::setPixmapSize(QSize size)
|
||||||
|
{
|
||||||
|
pixSize = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize GraphicsPixmap::pixsize()
|
||||||
|
{
|
||||||
|
return pixSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF GraphicsPixmap::boundingRect() const
|
||||||
|
{
|
||||||
|
return QRectF(offset, pix.size() / pix.devicePixelRatio());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
|
||||||
|
{
|
||||||
|
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||||
|
painter->drawPixmap(offset, pix.scaled(pixSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||||
|
}
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef GRAPHICSPIXMAP_H
|
||||||
|
#define GRAPHICSPIXMAP_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QGraphicsObject>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
class GraphicsPixmap : public QGraphicsObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QPointF itemoffset READ itemoffset WRITE setItemOffset)
|
||||||
|
Q_PROPERTY(QSize itemsize READ pixsize WRITE setPixmapSize)
|
||||||
|
|
||||||
|
public:
|
||||||
|
GraphicsPixmap();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QRectF boundingRect() const Q_DECL_OVERRIDE;
|
||||||
|
void setItemOffset(QPointF ponit);
|
||||||
|
QPointF itemoffset();
|
||||||
|
QSize pixsize();
|
||||||
|
void setPixmap(const QPixmap& pixmap);
|
||||||
|
void setPixmapSize(QSize size);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
|
||||||
|
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPixmap pix;
|
||||||
|
QPointF offset;
|
||||||
|
QSize pixSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GRAPHICSPIXMAP_H
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
#include "graphicsview.h"
|
||||||
|
|
||||||
|
GraphicsView::GraphicsView(QGraphicsScene *scene)
|
||||||
|
: QGraphicsView(scene)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
GraphicsView::~GraphicsView()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsView::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
QGraphicsView::resizeEvent(event);
|
||||||
|
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef GRAPHICSVIEW_H
|
||||||
|
#define GRAPHICSVIEW_H
|
||||||
|
|
||||||
|
#include <QGraphicsView>
|
||||||
|
|
||||||
|
class GraphicsView : public QGraphicsView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
GraphicsView(QGraphicsScene *scene);
|
||||||
|
~GraphicsView();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GRAPHICSVIEW_H
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
QT += core gui
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||||
|
|
||||||
|
TARGET = imageviewwindow
|
||||||
|
TEMPLATE = app
|
||||||
|
DESTDIR = $$PWD/../bin
|
||||||
|
CONFIG += warn_off
|
||||||
|
|
||||||
|
HEADERS += graphicsview.h
|
||||||
|
HEADERS += graphicspixmap.h
|
||||||
|
HEADERS += imageviewwindow.h
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
|
SOURCES += graphicspixmap.cpp
|
||||||
|
SOURCES += graphicsview.cpp
|
||||||
|
SOURCES += imageviewwindow.cpp
|
||||||
|
|
||||||
|
FORMS += imageviewwindow.ui
|
||||||
|
RESOURCES += imageviewwindow.qrc
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/ImageViewWindow">
|
||||||
|
<file>Resources/1.jpg</file>
|
||||||
|
<file>Resources/2.jpg</file>
|
||||||
|
<file>Resources/3.jpg</file>
|
||||||
|
<file>Resources/4.jpg</file>
|
||||||
|
<file>Resources/5.jpg</file>
|
||||||
|
<file>Resources/6.jpg</file>
|
||||||
|
<file>Resources/7.jpg</file>
|
||||||
|
<file>Resources/Wblog_left.png</file>
|
||||||
|
<file>Resources/Wblog_right.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ImageViewWindowClass</class>
|
||||||
|
<widget class="QWidget" name="ImageViewWindowClass">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1062</width>
|
||||||
|
<height>538</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>ImageViewWindow</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="viewlayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<resources>
|
||||||
|
<include location="imageviewwindow.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
#pragma execution_character_set("utf-8")
|
||||||
|
|
||||||
|
#include "imageviewwindow.h"
|
||||||
|
#include <QtWidgets/QApplication>
|
||||||
|
#include <QTextCodec>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
a.setFont(QFont("Microsoft Yahei", 9));
|
||||||
|
|
||||||
|
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
|
||||||
|
#if _MSC_VER
|
||||||
|
QTextCodec *codec = QTextCodec::codecForName("gbk");
|
||||||
|
#else
|
||||||
|
QTextCodec *codec = QTextCodec::codecForName("utf-8");
|
||||||
|
#endif
|
||||||
|
QTextCodec::setCodecForLocale(codec);
|
||||||
|
QTextCodec::setCodecForCStrings(codec);
|
||||||
|
QTextCodec::setCodecForTr(codec);
|
||||||
|
#else
|
||||||
|
QTextCodec *codec = QTextCodec::codecForName("utf-8");
|
||||||
|
QTextCodec::setCodecForLocale(codec);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ImageViewWindow w;
|
||||||
|
w.show();
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
TEMPLATE = subdirs
|
||||||
|
SUBDIRS += astackwidget
|
||||||
|
SUBDIRS += imagecropper
|
||||||
|
SUBDIRS += imageviewwindow
|
||||||
|
SUBDIRS += slidepuzzlewidget
|
||||||
|
After Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 81 KiB |
@ -0,0 +1,8 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/FrmSlidePuzzleWidget">
|
||||||
|
<file>Resources/back1.png</file>
|
||||||
|
<file>Resources/back2.png</file>
|
||||||
|
<file>Resources/back3.png</file>
|
||||||
|
<file>Resources/back4.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FrmSlidePuzzleWidgetClass</class>
|
||||||
|
<widget class="QWidget" name="FrmSlidePuzzleWidgetClass">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>400</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>FrmSlidePuzzleWidget</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="SliderPuzzleWidget" name="sliderpuzzleWidget" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>SliderPuzzleWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>sliderpuzzlewidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources>
|
||||||
|
<include location="frmslidepuzzlewidget.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
QT += core gui
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||||
|
|
||||||
|
TEMPLATE = app
|
||||||
|
TARGET = slidepuzzlewidget
|
||||||
|
DESTDIR = $$PWD/../bin
|
||||||
|
CONFIG += warn_off
|
||||||
|
|
||||||
|
HEADERS += frmslidepuzzlewidget.h
|
||||||
|
HEADERS += puzzlewidget.h
|
||||||
|
HEADERS += sliderpuzzlewidget.h
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
|
SOURCES += frmslidepuzzlewidget.cpp
|
||||||
|
SOURCES += puzzlewidget.cpp
|
||||||
|
SOURCES += sliderpuzzlewidget.cpp
|
||||||
|
|
||||||
|
FORMS += frmslidepuzzlewidget.ui
|
||||||
|
FORMS += sliderpuzzlewidget.ui
|
||||||
|
RESOURCES += frmslidepuzzlewidget.qrc
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>SliderPuzzleWidget</class>
|
||||||
|
<widget class="QWidget" name="SliderPuzzleWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>717</width>
|
||||||
|
<height>320</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>SliderPuzzleWidget</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>14</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="PuzzleWidget" name="puzzlewidget" native="true"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="horizontalSlider">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>PuzzleWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>puzzlewidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||