Qt編寫自定義控件16-魔法老鼠

前言

五一期間一直忙着大屏電子看板軟件的開發,沒有再去整理控件,今天已經將大屏電子看板的全部子窗口都實現了任意停靠和雙擊獨立再次雙擊最大化等功能,過陣子有空再寫一篇文章介紹其中的技術點。魔法老鼠控件,來自Qt自帶的demo,我只是將其修改了部分顏色接口等。c++

實現的功能

  • 1:可設置身體+眼睛+眼珠+鼻子+尾巴的顏色
  • 2:可設置停留位置旋轉角度

效果圖

頭文件代碼

#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();
    }
}

控件介紹

  1. 超過145個精美控件,涵蓋了各類儀表盤、進度條、進度球、指南針、曲線圖、標尺、溫度計、導航條、導航欄,flatui、高亮按鈕、滑動選擇器、農曆等。遠超qwt集成的控件數量。
  2. 每一個類均可以獨立成一個單獨的控件,零耦合,每一個控件一個頭文件和一個實現文件,不依賴其餘文件,方便單個控件以源碼形式集成到項目中,較少代碼量。qwt的控件類環環相扣,高度耦合,想要使用其中一個控件,必須包含全部的代碼。
  3. 所有純Qt編寫,QWidget+QPainter繪製,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等編譯器,不亂碼,可直接集成到Qt Creator中,和自帶的控件同樣使用,大部分效果只要設置幾個屬性便可,極爲方便。
  4. 每一個控件都有一個對應的單獨的包含該控件源碼的DEMO,方便參考使用。同時還提供一個全部控件使用的集成的DEMO。
  5. 每一個控件的源代碼都有詳細中文註釋,都按照統一設計規範編寫,方便學習自定義控件的編寫。
  6. 每一個控件默認配色和demo對應的配色都很是精美。
  7. 超過130個可見控件,6個不可見控件。
  8. 部分控件提供多種樣式風格選擇,多種指示器樣式選擇。
  9. 全部控件自適應窗體拉伸變化。
  10. 集成自定義控件屬性設計器,支持拖曳設計,所見即所得,支持導入導出xml格式。
  11. 自帶activex控件demo,全部控件能夠直接運行在ie瀏覽器中。
  12. 集成fontawesome圖形字體+阿里巴巴iconfont收藏的幾百個圖形字體,享受圖形字體帶來的樂趣。
  13. 全部控件最後生成一個dll動態庫文件,能夠直接集成到qtcreator中拖曳設計使用。

SDK下載

  • SDK下載連接:https://pan.baidu.com/s/1tD9v1YPfE2fgYoK6lqUr1Q 提取碼:lyhk
  • 自定義控件+屬性設計器欣賞:https://pan.baidu.com/s/1l6L3rKSiLu_uYi7lnL3ibQ 提取碼:tmvl
  • 下載連接中包含了各個版本的動態庫文件,全部控件的頭文件,使用demo。
  • 自定義控件插件開放動態庫dll使用(永久免費),無任何後門和限制,請放心使用。
  • 目前已提供26個版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
  • 不按期增長控件和完善控件,不按期更新SDK,歡迎各位提出建議,謝謝!
  • widget版本(QQ:517216493)qml版本(QQ:373955953)三峯駝(QQ:278969898)。

相關文章
相關標籤/搜索