#pragma execution_character_set("utf-8") #include "MoveButton.h" #include "qpainter.h" #include "qevent.h" #include "qtimer.h" #include "qdebug.h" MoveButton::MoveButton(QWidget *parent) : QWidget(parent) { text = ""; textColor = QColor(255, 255, 255); borderOutColorStart = QColor(255, 255, 255); borderOutColorEnd = QColor(166, 166, 166); borderInColorStart = QColor(166, 166, 166); borderInColorEnd = QColor(255, 255, 255); bgColor = QColor(100, 184, 255); showRect = false; showOverlay = true; overlayColor = QColor(255, 255, 255); canMove = false; this->installEventFilter(this); timerAlarm = new QTimer(this); connect(timerAlarm, SIGNAL(timeout()), this, SLOT(alarm())); timerAlarm->setInterval(500); //setFont(QFont("Arial", 8)); } bool MoveButton::eventFilter(QObject *watched, QEvent *event) { if (canMove) { static QPoint lastPnt; static bool pressed = false; QMouseEvent *mouseEvent = static_cast(event); if (mouseEvent->type() == QEvent::MouseButtonPress) { if (this->rect().contains(mouseEvent->pos()) && (mouseEvent->button() == Qt::LeftButton)) { lastPnt = mouseEvent->pos(); pressed = true; } } else if (mouseEvent->type() == QEvent::MouseMove && pressed) { int dx = mouseEvent->pos().x() - lastPnt.x(); int dy = mouseEvent->pos().y() - lastPnt.y(); this->move(this->x() + dx, this->y() + dy); } else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed) { pressed = false; } } return QWidget::eventFilter(watched, event); } void MoveButton::paintEvent(QPaintEvent *) { int width = this->width(); int height = this->height(); int side = qMin(width, height); //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); if (showRect) { //绘制矩形区域 painter.setPen(Qt::NoPen); painter.setBrush(bgColor); painter.drawRoundedRect(this->rect(), 5, 5); //绘制文字 if (!text.isEmpty()) { QFont font; font.setPixelSize(side - 20); painter.setFont(font); painter.setPen(textColor); painter.drawText(this->rect(), Qt::AlignCenter, text); } } else { painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //绘制外边框 drawBorderOut(&painter); //绘制内边框 drawBorderIn(&painter); //绘制内部指示颜色 drawBg(&painter); //绘制居中文字 drawText(&painter); //绘制遮罩层 drawOverlay(&painter); } } void MoveButton::drawBorderOut(QPainter *painter) { int radius = 99; painter->save(); painter->setPen(Qt::NoPen); QLinearGradient borderGradient(0, -radius, 0, radius); borderGradient.setColorAt(0, borderOutColorStart); borderGradient.setColorAt(1, borderOutColorEnd); painter->setBrush(borderGradient); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void MoveButton::drawBorderIn(QPainter *painter) { int radius = 90; painter->save(); painter->setPen(Qt::NoPen); QLinearGradient borderGradient(0, -radius, 0, radius); borderGradient.setColorAt(0, borderInColorStart); borderGradient.setColorAt(1, borderInColorEnd); painter->setBrush(borderGradient); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void MoveButton::drawBg(QPainter *painter) { int radius = 80; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(bgColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore(); } void MoveButton::drawText(QPainter *painter) { if (text.isEmpty()) { return; } int radius = 100; painter->save(); QFont font; font.setPixelSize(85); painter->setFont(font); painter->setPen(textColor); QRect rect(-radius, -radius, radius * 2, radius * 2); painter->drawText(rect, Qt::AlignCenter, text); painter->restore(); } void MoveButton::drawOverlay(QPainter *painter) { if (!showOverlay) { return; } int radius = 80; painter->save(); painter->setPen(Qt::NoPen); QPainterPath smallCircle; QPainterPath bigCircle; radius -= 1; smallCircle.addEllipse(-radius, -radius, radius * 2, radius * 2); radius *= 2; bigCircle.addEllipse(-radius, -radius + 140, radius * 2, radius * 2); //高光的形状为小圆扣掉大圆的部分 QPainterPath highlight = smallCircle - bigCircle; QLinearGradient linearGradient(0, -radius / 2, 0, 0); overlayColor.setAlpha(100); linearGradient.setColorAt(0.0, overlayColor); overlayColor.setAlpha(30); linearGradient.setColorAt(1.0, overlayColor); painter->setBrush(linearGradient); painter->rotate(-20); painter->drawPath(highlight); painter->restore(); } QString MoveButton::getText() const { return this->text; } QColor MoveButton::getTextColor() const { return this->textColor; } QColor MoveButton::getBorderOutColorStart() const { return this->borderOutColorStart; } QColor MoveButton::getBorderOutColorEnd() const { return this->borderOutColorEnd; } QColor MoveButton::getBorderInColorStart() const { return this->borderInColorStart; } QColor MoveButton::getBorderInColorEnd() const { return this->borderInColorEnd; } QColor MoveButton::getBgColor() const { return this->bgColor; } bool MoveButton::getCanMove() const { return this->canMove; } bool MoveButton::getShowRect() const { return this->showRect; } bool MoveButton::getShowOverlay() const { return this->showOverlay; } QColor MoveButton::getOverlayColor() const { return this->overlayColor; } QSize MoveButton::sizeHint() const { return QSize(100, 100); } QSize MoveButton::minimumSizeHint() const { return QSize(10, 10); } void MoveButton::setText(const QString &text) { if (this->text != text) { this->text = text; update(); } } void MoveButton::setTextColor(const QColor &textColor) { if (this->textColor != textColor) { this->textColor = textColor; update(); } } void MoveButton::setBorderOutColorStart(const QColor &borderOutColorStart) { if (this->borderOutColorStart != borderOutColorStart) { this->borderOutColorStart = borderOutColorStart; update(); } } void MoveButton::setBorderOutColorEnd(const QColor &borderOutColorEnd) { if (this->borderOutColorEnd != borderOutColorEnd) { this->borderOutColorEnd = borderOutColorEnd; update(); } } void MoveButton::setBorderInColorStart(const QColor &borderInColorStart) { if (this->borderInColorStart != borderInColorStart) { this->borderInColorStart = borderInColorStart; update(); } } void MoveButton::setBorderInColorEnd(const QColor &borderInColorEnd) { if (this->borderInColorEnd != borderInColorEnd) { this->borderInColorEnd = borderInColorEnd; update(); } } void MoveButton::setBgColor(const QColor &bgColor) { if (this->bgColor != bgColor) { this->bgColor = bgColor; update(); } } void MoveButton::setCanMove(bool canMove) { if (this->canMove != canMove) { this->canMove = canMove; update(); } } void MoveButton::setShowRect(bool showRect) { if (this->showRect != showRect) { this->showRect = showRect; update(); } } void MoveButton::setShowOverlay(bool showOverlay) { if (this->showOverlay != showOverlay) { this->showOverlay = showOverlay; update(); } } void MoveButton::setOverlayColor(const QColor &overlayColor) { if (this->overlayColor != overlayColor) { this->overlayColor = overlayColor; update(); } } void MoveButton::setGreen() { textColor = QColor(255, 255, 255); setBgColor(QColor(0, 166, 0)); } void MoveButton::setRed() { textColor = QColor(255, 255, 255); setBgColor(QColor(255, 0, 0)); } void MoveButton::setYellow() { textColor = QColor(25, 50, 7); setBgColor(QColor(238, 238, 0)); } void MoveButton::setBlack() { textColor = QColor(255, 255, 255); setBgColor(QColor(10, 10, 10)); } void MoveButton::setGray() { textColor = QColor(255, 255, 255); setBgColor(QColor(129, 129, 129)); } void MoveButton::setBlue() { textColor = QColor(255, 255, 255); setBgColor(QColor(0, 0, 166)); } void MoveButton::setLightBlue() { textColor = QColor(255, 255, 255); setBgColor(QColor(100, 184, 255)); } void MoveButton::setLightRed() { textColor = QColor(255, 255, 255); setBgColor(QColor(255, 107, 107)); } void MoveButton::setLightGreen() { textColor = QColor(255, 255, 255); setBgColor(QColor(24, 189, 155)); } void MoveButton::startAlarm() { if (!timerAlarm->isActive()) { timerAlarm->start(); } } void MoveButton::stopAlarm() { if (timerAlarm->isActive()) { timerAlarm->stop(); } } void MoveButton::alarm() { static bool isRed = false; if (isRed) { this->setBlack(); } else { this->setRed(); } isRed = !isRed; }