diff --git a/README.md b/README.md index 8914bbc..989697a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ | 30 | videowidget | 通用视频控件 | | 31 | screenwidget | 屏幕截图控件 | | 32 | echartgauge | echart仪表盘含交互支持webkit及webengine | +| 33 | imageswitch | 图片开关控件 | ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lightbutton.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/movewidget.gif) @@ -65,4 +66,5 @@ ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lunarcalendarwidget.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/videowidget.gif) ![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/screenwidget.gif) -![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/echartgauge.gif) \ No newline at end of file +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/echartgauge.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/snap/imageswitch.gif) \ No newline at end of file diff --git a/imageswitch/frmimageswitch.cpp b/imageswitch/frmimageswitch.cpp new file mode 100644 index 0000000..7444d7a --- /dev/null +++ b/imageswitch/frmimageswitch.cpp @@ -0,0 +1,28 @@ +#pragma execution_character_set("utf-8") + +#include "frmimageswitch.h" +#include "ui_frmimageswitch.h" + +frmImageSwitch::frmImageSwitch(QWidget *parent) : QWidget(parent), ui(new Ui::frmImageSwitch) +{ + ui->setupUi(this); + this->initForm(); +} + +frmImageSwitch::~frmImageSwitch() +{ + delete ui; +} + +void frmImageSwitch::initForm() +{ + ui->imageSwitch1->setChecked(true); + ui->imageSwitch2->setChecked(true); + ui->imageSwitch3->setChecked(true); + ui->imageSwitch1->setFixedSize(87, 28); + ui->imageSwitch2->setFixedSize(87, 28); + ui->imageSwitch3->setFixedSize(87, 28); + ui->imageSwitch1->setButtonStyle(ImageSwitch::ButtonStyle_1); + ui->imageSwitch2->setButtonStyle(ImageSwitch::ButtonStyle_2); + ui->imageSwitch3->setButtonStyle(ImageSwitch::ButtonStyle_3); +} diff --git a/imageswitch/frmimageswitch.h b/imageswitch/frmimageswitch.h new file mode 100644 index 0000000..7f0e243 --- /dev/null +++ b/imageswitch/frmimageswitch.h @@ -0,0 +1,25 @@ +#ifndef FRMIMAGESWITCH_H +#define FRMIMAGESWITCH_H + +#include + +namespace Ui { +class frmImageSwitch; +} + +class frmImageSwitch : public QWidget +{ + Q_OBJECT + +public: + explicit frmImageSwitch(QWidget *parent = 0); + ~frmImageSwitch(); + +private: + Ui::frmImageSwitch *ui; + +private slots: + void initForm(); +}; + +#endif // FRMIMAGESWITCH_H diff --git a/imageswitch/frmimageswitch.ui b/imageswitch/frmimageswitch.ui new file mode 100644 index 0000000..6e1a376 --- /dev/null +++ b/imageswitch/frmimageswitch.ui @@ -0,0 +1,63 @@ + + + frmImageSwitch + + + + 0 + 0 + 500 + 300 + + + + Form + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + ImageSwitch + QWidget +
imageswitch.h
+
+
+ + +
diff --git a/imageswitch/image/btncheckoff1.png b/imageswitch/image/btncheckoff1.png new file mode 100644 index 0000000..bfa8ebb Binary files /dev/null and b/imageswitch/image/btncheckoff1.png differ diff --git a/imageswitch/image/btncheckoff2.png b/imageswitch/image/btncheckoff2.png new file mode 100644 index 0000000..32f43f2 Binary files /dev/null and b/imageswitch/image/btncheckoff2.png differ diff --git a/imageswitch/image/btncheckoff3.png b/imageswitch/image/btncheckoff3.png new file mode 100644 index 0000000..45bb934 Binary files /dev/null and b/imageswitch/image/btncheckoff3.png differ diff --git a/imageswitch/image/btncheckon1.png b/imageswitch/image/btncheckon1.png new file mode 100644 index 0000000..2bab009 Binary files /dev/null and b/imageswitch/image/btncheckon1.png differ diff --git a/imageswitch/image/btncheckon2.png b/imageswitch/image/btncheckon2.png new file mode 100644 index 0000000..4d5b59a Binary files /dev/null and b/imageswitch/image/btncheckon2.png differ diff --git a/imageswitch/image/btncheckon3.png b/imageswitch/image/btncheckon3.png new file mode 100644 index 0000000..a8de834 Binary files /dev/null and b/imageswitch/image/btncheckon3.png differ diff --git a/imageswitch/imageswitch.cpp b/imageswitch/imageswitch.cpp new file mode 100644 index 0000000..8e6641d --- /dev/null +++ b/imageswitch/imageswitch.cpp @@ -0,0 +1,91 @@ +#pragma execution_character_set("utf-8") + +#include "imageswitch.h" +#include "qpainter.h" +#include "qdebug.h" + +ImageSwitch::ImageSwitch(QWidget *parent) : QWidget(parent) +{ + isChecked = false; + buttonStyle = ButtonStyle_2; + + imgOffFile = ":/image/btncheckoff2.png"; + imgOnFile = ":/image/btncheckon2.png"; + imgFile = imgOffFile; +} + +void ImageSwitch::mousePressEvent(QMouseEvent *) +{ + imgFile = isChecked ? imgOffFile : imgOnFile; + isChecked = !isChecked; + this->update(); +} + +void ImageSwitch::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.setRenderHints(QPainter::SmoothPixmapTransform); + QImage img(imgFile); + img = img.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + + //按照比例自动居中绘制 + int pixX = rect().center().x() - img.width() / 2; + int pixY = rect().center().y() - img.height() / 2; + QPoint point(pixX, pixY); + painter.drawImage(point, img); +} + +bool ImageSwitch::getChecked() const +{ + return isChecked; +} + +ImageSwitch::ButtonStyle ImageSwitch::getButtonStyle() const +{ + return this->buttonStyle; +} + +QSize ImageSwitch::sizeHint() const +{ + return QSize(87, 28); +} + +QSize ImageSwitch::minimumSizeHint() const +{ + return QSize(87, 28); +} + +void ImageSwitch::setChecked(bool isChecked) +{ + if (this->isChecked != isChecked) { + this->isChecked = isChecked; + imgFile = isChecked ? imgOnFile : imgOffFile; + this->update(); + } +} + +void ImageSwitch::setButtonStyle(const ImageSwitch::ButtonStyle &buttonStyle) +{ + if (this->buttonStyle != buttonStyle) { + this->buttonStyle = buttonStyle; + + if (buttonStyle == ButtonStyle_1) { + imgOffFile = ":/image/btncheckoff1.png"; + imgOnFile = ":/image/btncheckon1.png"; + this->resize(87, 28); + } else if (buttonStyle == ButtonStyle_2) { + imgOffFile = ":/image/btncheckoff2.png"; + imgOnFile = ":/image/btncheckon2.png"; + this->resize(87, 28); + } else if (buttonStyle == ButtonStyle_3) { + imgOffFile = ":/image/btncheckoff3.png"; + imgOnFile = ":/image/btncheckon3.png"; + this->resize(96, 38); + } + + imgFile = isChecked ? imgOnFile : imgOffFile; + setChecked(isChecked); + this->update(); + updateGeometry(); + } +} diff --git a/imageswitch/imageswitch.h b/imageswitch/imageswitch.h new file mode 100644 index 0000000..8a3de52 --- /dev/null +++ b/imageswitch/imageswitch.h @@ -0,0 +1,63 @@ +#ifndef IMAGESWITCH_H +#define IMAGESWITCH_H + +/** + * 图片开关控件 作者:feiyangqingyun(QQ:517216493) 2016-11-25 + * 1:自带三种开关按钮样式 + * 2:可自定义开关图片 + */ + +#include + +#ifdef quc +#if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) +#include +#else +#include +#endif + +class QDESIGNER_WIDGET_EXPORT ImageSwitch : public QWidget +#else +class ImageSwitch : public QWidget +#endif + +{ + Q_OBJECT + Q_ENUMS(ButtonStyle) + + Q_PROPERTY(bool isChecked READ getChecked WRITE setChecked) + Q_PROPERTY(ButtonStyle buttonStyle READ getButtonStyle WRITE setButtonStyle) + +public: + enum ButtonStyle { + ButtonStyle_1 = 0, //开关样式1 + ButtonStyle_2 = 1, //开关样式2 + ButtonStyle_3 = 2 //开关样式3 + }; + + explicit ImageSwitch(QWidget *parent = 0); + +protected: + void mousePressEvent(QMouseEvent *); + void paintEvent(QPaintEvent *event); + +private: + bool isChecked; + ButtonStyle buttonStyle; + + QString imgOffFile; + QString imgOnFile; + QString imgFile; + +public: + bool getChecked() const; + ButtonStyle getButtonStyle() const; + QSize sizeHint() const; + QSize minimumSizeHint() const; + +public Q_SLOTS: + void setChecked(bool isChecked); + void setButtonStyle(const ImageSwitch::ButtonStyle &buttonStyle); +}; + +#endif // IMAGESWITCH_H diff --git a/imageswitch/imageswitch.pro b/imageswitch/imageswitch.pro new file mode 100644 index 0000000..548a8f3 --- /dev/null +++ b/imageswitch/imageswitch.pro @@ -0,0 +1,25 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2017-02-08T14:39:46 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = imageswitch +TEMPLATE = app +DESTDIR = $$PWD/../bin +CONFIG += warn_off + +SOURCES += main.cpp +SOURCES += frmimageswitch.cpp +SOURCES += imageswitch.cpp + +HEADERS += frmimageswitch.h +HEADERS += imageswitch.h + +FORMS += frmimageswitch.ui + +RESOURCES += main.qrc diff --git a/imageswitch/main.cpp b/imageswitch/main.cpp new file mode 100644 index 0000000..247fe10 --- /dev/null +++ b/imageswitch/main.cpp @@ -0,0 +1,31 @@ +#pragma execution_character_set("utf-8") + +#include "frmimageswitch.h" +#include +#include + +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 + + frmImageSwitch w; + w.setWindowTitle("图片背景开关"); + w.show(); + + return a.exec(); +} diff --git a/imageswitch/main.qrc b/imageswitch/main.qrc new file mode 100644 index 0000000..d22919e --- /dev/null +++ b/imageswitch/main.qrc @@ -0,0 +1,10 @@ + + + image/btncheckoff1.png + image/btncheckoff2.png + image/btncheckoff3.png + image/btncheckon1.png + image/btncheckon2.png + image/btncheckon3.png + + diff --git a/snap/imageswitch.gif b/snap/imageswitch.gif new file mode 100644 index 0000000..767bcf4 Binary files /dev/null and b/snap/imageswitch.gif differ