BIN
slidepuzzlewidget/Resources/back1.png
Normal file
BIN
slidepuzzlewidget/Resources/back1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 147 KiB |
BIN
slidepuzzlewidget/Resources/back2.png
Normal file
BIN
slidepuzzlewidget/Resources/back2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 291 KiB |
BIN
slidepuzzlewidget/Resources/back3.png
Normal file
BIN
slidepuzzlewidget/Resources/back3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
BIN
slidepuzzlewidget/Resources/back4.png
Normal file
BIN
slidepuzzlewidget/Resources/back4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
18
slidepuzzlewidget/frmslidepuzzlewidget.cpp
Normal file
18
slidepuzzlewidget/frmslidepuzzlewidget.cpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#include "frmslidepuzzlewidget.h"
|
||||||
|
|
||||||
|
FrmSlidePuzzleWidget::FrmSlidePuzzleWidget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
ui.setupUi(this);
|
||||||
|
this->initForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
FrmSlidePuzzleWidget::~FrmSlidePuzzleWidget()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrmSlidePuzzleWidget::initForm()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
22
slidepuzzlewidget/frmslidepuzzlewidget.h
Normal file
22
slidepuzzlewidget/frmslidepuzzlewidget.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef FRMSLIDEPUZZLEWIDGET_H
|
||||||
|
#define FRMSLIDEPUZZLEWIDGET_H
|
||||||
|
|
||||||
|
#include <QtWidgets/QWidget>
|
||||||
|
#include "ui_frmslidepuzzlewidget.h"
|
||||||
|
|
||||||
|
class FrmSlidePuzzleWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
FrmSlidePuzzleWidget(QWidget *parent = 0);
|
||||||
|
~FrmSlidePuzzleWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initForm();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::FrmSlidePuzzleWidgetClass ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FRMSLIDEPUZZLEWIDGET_H
|
||||||
8
slidepuzzlewidget/frmslidepuzzlewidget.qrc
Normal file
8
slidepuzzlewidget/frmslidepuzzlewidget.qrc
Normal file
@@ -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>
|
||||||
50
slidepuzzlewidget/frmslidepuzzlewidget.ui
Normal file
50
slidepuzzlewidget/frmslidepuzzlewidget.ui
Normal file
@@ -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>
|
||||||
30
slidepuzzlewidget/main.cpp
Normal file
30
slidepuzzlewidget/main.cpp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma execution_character_set("utf-8")
|
||||||
|
|
||||||
|
#include "frmslidepuzzlewidget.h"
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QTextCodec>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
a.setFont(QFont("Microsoft Yahei", 10));
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
FrmSlidePuzzleWidget w;
|
||||||
|
w.setWindowTitle("滑块图片验证码");
|
||||||
|
w.show();
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
81
slidepuzzlewidget/puzzlewidget.cpp
Normal file
81
slidepuzzlewidget/puzzlewidget.cpp
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#include "puzzlewidget.h"
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QPainterPath>
|
||||||
|
#include <QTime>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
const int squarewidth = 46;
|
||||||
|
const int squareradius = 20;
|
||||||
|
PuzzleWidget::PuzzleWidget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
m_value = 0;
|
||||||
|
m_offsetPoint = QPoint(0, 0);
|
||||||
|
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
|
||||||
|
}
|
||||||
|
|
||||||
|
PuzzleWidget::~PuzzleWidget()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuzzleWidget::setPixmap(const QString& pixmap)
|
||||||
|
{
|
||||||
|
m_pixmap = pixmap;
|
||||||
|
QTimer::singleShot(10, this, SLOT(onUpdatePixmap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuzzleWidget::onUpdatePixmap()
|
||||||
|
{
|
||||||
|
m_offsetPoint.rx() = qBound(0, qrand() % this->width() + squarewidth + squareradius, this->width() - squarewidth - squareradius);
|
||||||
|
m_offsetPoint.ry() = qBound(0, qrand() % this->height() + squarewidth + squareradius, this->height() - squarewidth - squareradius);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuzzleWidget::setValue(int value)
|
||||||
|
{
|
||||||
|
m_value = qBound(0, value, this->width() - squarewidth - squareradius + m_offsetPoint.x());
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PuzzleWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QPainter painter(this);
|
||||||
|
painter.setRenderHints(QPainter::Antialiasing);
|
||||||
|
QPainterPath clippath;
|
||||||
|
clippath.addRoundedRect(this->rect(), 4, 4);
|
||||||
|
painter.setClipPath(clippath);
|
||||||
|
const QPixmap& pixmap = QPixmap(m_pixmap).scaled(this->width(), this->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
painter.drawPixmap(0, 0, this->width(), this->height(), pixmap);
|
||||||
|
|
||||||
|
QPainterPath cutoutpath;
|
||||||
|
cutoutpath.setFillRule(Qt::WindingFill);
|
||||||
|
QRect rect(m_offsetPoint, QSize(squarewidth, squarewidth));
|
||||||
|
cutoutpath.addRoundedRect(rect, 2, 2);
|
||||||
|
cutoutpath.addEllipse(rect.center().x() - squareradius / 2, rect.top() - squareradius + 6, squareradius, squareradius);
|
||||||
|
QPainterPath subellipseparh;
|
||||||
|
subellipseparh.addEllipse(rect.right() - squareradius + 6, rect.center().y() - squareradius / 2, squareradius, squareradius);
|
||||||
|
cutoutpath -= subellipseparh;
|
||||||
|
|
||||||
|
painter.setPen(QPen(QColor(80, 80, 80), 1));
|
||||||
|
painter.setBrush(QColor(100, 100, 100, 220));
|
||||||
|
painter.drawPath(cutoutpath);
|
||||||
|
|
||||||
|
QPixmap puzzlePixmap(this->size());
|
||||||
|
puzzlePixmap.fill(Qt::transparent);
|
||||||
|
QPainter puzzlePainter(&puzzlePixmap);
|
||||||
|
puzzlePainter.setRenderHints(QPainter::Antialiasing);
|
||||||
|
puzzlePainter.setClipPath(cutoutpath);
|
||||||
|
puzzlePainter.setPen(QPen(QColor(80, 80, 80), 2));
|
||||||
|
puzzlePainter.setBrush(QColor(200, 200, 200, 100));
|
||||||
|
puzzlePainter.drawPixmap(0, 0, this->width(), this->height(), pixmap);
|
||||||
|
puzzlePainter.drawPath(cutoutpath);
|
||||||
|
|
||||||
|
painter.drawPixmap(-m_offsetPoint.x() + m_value, 0, this->width(), this->height(), puzzlePixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PuzzleWidget::isOverlap()
|
||||||
|
{
|
||||||
|
return qAbs(-m_offsetPoint.x() + m_value) < 5;
|
||||||
|
}
|
||||||
34
slidepuzzlewidget/puzzlewidget.h
Normal file
34
slidepuzzlewidget/puzzlewidget.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef PUZZLEWIDGET_H
|
||||||
|
#define PUZZLEWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class PuzzleWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QString pixmap READ getPixmap WRITE setPixmap)
|
||||||
|
|
||||||
|
public:
|
||||||
|
PuzzleWidget(QWidget *parent);
|
||||||
|
~PuzzleWidget();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QString getPixmap() const { return m_pixmap; };
|
||||||
|
void setPixmap(const QString& pixmap);
|
||||||
|
|
||||||
|
void setValue(int value);
|
||||||
|
bool isOverlap();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onUpdatePixmap();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_value;
|
||||||
|
QString m_pixmap;
|
||||||
|
QPoint m_offsetPoint;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PUZZLEWIDGET_H
|
||||||
29
slidepuzzlewidget/slidepuzzlewidget.pro
Normal file
29
slidepuzzlewidget/slidepuzzlewidget.pro
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# ----------------------------------------------------
|
||||||
|
# This file is generated by the Qt Visual Studio Add-in.
|
||||||
|
# ------------------------------------------------------
|
||||||
|
|
||||||
|
QT += core gui
|
||||||
|
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
49
slidepuzzlewidget/sliderpuzzlewidget.cpp
Normal file
49
slidepuzzlewidget/sliderpuzzlewidget.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#pragma execution_character_set("utf-8")
|
||||||
|
#include "sliderpuzzlewidget.h"
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
SliderPuzzleWidget::SliderPuzzleWidget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
ui.setupUi(this);
|
||||||
|
this->initForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
SliderPuzzleWidget::~SliderPuzzleWidget()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliderPuzzleWidget::initForm()
|
||||||
|
{
|
||||||
|
QTimer::singleShot(10, this, SLOT(onUpdateWidget()));
|
||||||
|
connect(ui.horizontalSlider, &QSlider::valueChanged, this, &SliderPuzzleWidget::onSliderValueChanged);
|
||||||
|
connect(ui.horizontalSlider, &QSlider::sliderReleased, this, &SliderPuzzleWidget::onSliderReleased);
|
||||||
|
ui.puzzlewidget->setPixmap(":/FrmSlidePuzzleWidget/Resources/back1.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliderPuzzleWidget::onUpdateWidget()
|
||||||
|
{
|
||||||
|
ui.horizontalSlider->setRange(0, this->width());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliderPuzzleWidget::onSliderValueChanged(int value)
|
||||||
|
{
|
||||||
|
ui.puzzlewidget->setValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliderPuzzleWidget::onSliderReleased()
|
||||||
|
{
|
||||||
|
QString content = ui.puzzlewidget->isOverlap() ? "验证成功!" : "验证失败!";
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setWindowTitle("滑块图片验证码");
|
||||||
|
msgBox.setText(content);
|
||||||
|
msgBox.exec();
|
||||||
|
|
||||||
|
static int testIndex = 1;
|
||||||
|
testIndex = testIndex + 1 > 4 ? 1 : testIndex + 1;
|
||||||
|
ui.horizontalSlider->setValue(0);
|
||||||
|
ui.puzzlewidget->setPixmap(QString(":/FrmSlidePuzzleWidget/Resources/back%1.png").arg(testIndex));
|
||||||
|
}
|
||||||
27
slidepuzzlewidget/sliderpuzzlewidget.h
Normal file
27
slidepuzzlewidget/sliderpuzzlewidget.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef SLIDERPUZZLEWIDGET_H
|
||||||
|
#define SLIDERPUZZLEWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "ui_sliderpuzzlewidget.h"
|
||||||
|
|
||||||
|
class SliderPuzzleWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SliderPuzzleWidget(QWidget *parent = 0);
|
||||||
|
~SliderPuzzleWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initForm();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onUpdateWidget();
|
||||||
|
void onSliderValueChanged(int value);
|
||||||
|
void onSliderReleased();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::SliderPuzzleWidget ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SLIDERPUZZLEWIDGET_H
|
||||||
55
slidepuzzlewidget/sliderpuzzlewidget.ui
Normal file
55
slidepuzzlewidget/sliderpuzzlewidget.ui
Normal file
@@ -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>
|
||||||
Reference in New Issue
Block a user