五一期間一直忙着大屏電子看板軟件的開發,沒有再去整理控件,今天已經將大屏電子看板的全部子窗口都實現了任意停靠和雙擊獨立再次雙擊最大化等功能,過陣子有空再寫一篇文章介紹其中的技術點。魔法老鼠控件,來自Qt自帶的demo,我只是將其修改了部分顏色接口等。c++
#ifndef MAGICMOUSE_H #define MAGICMOUSE_H /** * 魔幻老鼠控件 做者:feiyangqingyun(QQ:517216493) 2018-7-15 * 本控件來源於qtdemo * 1:可設置身體+眼睛+眼珠+鼻子+尾巴的顏色 * 2:可設置停留位置旋轉角度 */ #include <QWidget> #ifdef quc #if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) #include <QtDesigner/QDesignerExportWidget> #else #include <QtUiPlugin/QDesignerExportWidget> #endif class QDESIGNER_WIDGET_EXPORT MagicMouse : public QWidget #else class MagicMouse : public QWidget #endif { Q_OBJECT Q_PROPERTY(int angle READ getAngle WRITE setAngle) Q_PROPERTY(QColor bodyColor READ getBodyColor WRITE setBodyColor) Q_PROPERTY(QColor eyeColor READ getEyeColor WRITE setEyeColor) Q_PROPERTY(QColor eyeballColor READ getEyeballColor WRITE setEyeballColor) Q_PROPERTY(QColor noseColor READ getNoseColor WRITE setNoseColor) Q_PROPERTY(QColor earColor READ getEarColor WRITE setEarColor) Q_PROPERTY(QColor tailColor READ getTailColor WRITE setTailColor) public: explicit MagicMouse(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *); private: int angle; //旋轉角度 QColor bodyColor; //身體顏色 QColor eyeColor; //眼睛顏色 QColor eyeballColor; //眼珠顏色 QColor noseColor; //鼻子顏色 QColor earColor; //耳朵顏色 QColor tailColor; //尾巴顏色 public: int getAngle() const; QColor getBodyColor() const; QColor getEyeColor() const; QColor getEyeballColor() const; QColor getNoseColor() const; QColor getEarColor() const; QColor getTailColor() const; QSize sizeHint() const; QSize minimumSizeHint() const; public slots: //設置旋轉角度 void setAngle(int angle); //設置身體顏色 void setBodyColor(const QColor &bodyColor); //設置眼睛顏色 void setEyeColor(const QColor &eyeColor); //設置眼珠顏色 void setEyeballColor(const QColor &eyeballColor); //設置鼻子顏色 void setNoseColor(const QColor &noseColor); //設置耳朵顏色 void setEarColor(const QColor &earColor); //設置尾巴顏色 void setTailColor(const QColor &tailColor); }; #endif // MAGICMOUSE_H
#pragma execution_character_set("utf-8") #include "magicmouse.h" #include "qpainter.h" #include "qdebug.h" MagicMouse::MagicMouse(QWidget *parent) : QWidget(parent) { angle = 0; bodyColor = QColor(29, 89, 115); eyeColor = QColor(30, 30, 30); eyeballColor = QColor(255, 255, 255); noseColor = QColor(30, 30, 30); earColor = QColor(86, 190, 193); tailColor = QColor(168, 126, 166); } void MagicMouse::paintEvent(QPaintEvent *e) { int width = this->width(); int height = this->height(); int side = qMin(width, height); //繪製準備工做,啓用反鋸齒 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 100.0, side / 100.0); painter.rotate(angle); //繪製橢圓身體 painter.setPen(Qt::NoPen); painter.setBrush(bodyColor); painter.drawEllipse(-20, -40, 40, 65); //繪製圓形眼睛 int eyeSize = 14; int eyeY = -38; painter.setBrush(eyeColor); painter.drawEllipse(-16, eyeY, eyeSize, eyeSize); painter.drawEllipse(2, eyeY, eyeSize, eyeSize); //繪製兩個眼珠 int eyeballSize = 8; int eyeballY = -38; painter.setBrush(eyeballColor); painter.drawEllipse(-14, eyeballY, eyeballSize, eyeballSize); painter.drawEllipse(6, eyeballY, eyeballSize, eyeballSize); //繪製鼻子 int noseSize = 8; int noseY = -45; painter.setBrush(noseColor); painter.drawEllipse(-4, noseY, noseSize, noseSize); //繪製圓形大耳朵 int earSize = 26; int earY = -28; painter.setBrush(earColor); painter.drawEllipse(-27, earY, earSize, earSize); painter.drawEllipse(1, earY, earSize, earSize); //繪製尾巴 int tailX = 5; int tailY = 25; QPainterPath path(QPointF(0, tailY)); path.cubicTo(-tailX, tailY + 2, -tailX, tailY + 2, 0, tailY + 5); path.cubicTo(tailX, tailY + 7, tailX, tailY + 7, 0, tailY + 10); path.cubicTo(-tailX, tailY + 12, -tailX, tailY + 22, 0, tailY + 15); QPen pen; pen.setWidth(2); pen.setColor(tailColor); pen.setCapStyle(Qt::RoundCap); painter.setPen(pen); painter.setBrush(Qt::NoBrush); painter.drawPath(path); } int MagicMouse::getAngle() const { return this->angle; } QColor MagicMouse::getBodyColor() const { return this->bodyColor; } QColor MagicMouse::getEyeColor() const { return this->eyeColor; } QColor MagicMouse::getEyeballColor() const { return this->eyeballColor; } QColor MagicMouse::getNoseColor() const { return this->noseColor; } QColor MagicMouse::getEarColor() const { return this->earColor; } QColor MagicMouse::getTailColor() const { return this->tailColor; } QSize MagicMouse::sizeHint() const { return QSize(200, 200); } QSize MagicMouse::minimumSizeHint() const { return QSize(30, 30); } void MagicMouse::setAngle(int angle) { if (this->angle != angle) { this->angle = angle; update(); } } void MagicMouse::setBodyColor(const QColor &bodyColor) { if (this->bodyColor != bodyColor) { this->bodyColor = bodyColor; update(); } } void MagicMouse::setEyeColor(const QColor &eyeColor) { if (this->eyeColor != eyeColor) { this->eyeColor = eyeColor; update(); } } void MagicMouse::setEyeballColor(const QColor &eyeballColor) { if (this->eyeballColor != eyeballColor) { this->eyeballColor = eyeballColor; update(); } } void MagicMouse::setNoseColor(const QColor &noseColor) { if (this->noseColor != noseColor) { this->noseColor = noseColor; update(); } } void MagicMouse::setEarColor(const QColor &earColor) { if (this->earColor != earColor) { this->earColor = earColor; update(); } } void MagicMouse::setTailColor(const QColor &tailColor) { if (this->tailColor != tailColor) { this->tailColor = tailColor; update(); } }