Qt編寫自定義控件實現(xiàn)抽獎轉(zhuǎn)盤
更新時間:2022年06月14日 11:42:55 作者:友善啊,朋友
這篇文章主要為大家詳細介紹了Qt編寫自定義控件實現(xiàn)抽獎轉(zhuǎn)盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Qt自定義控件實現(xiàn)抽獎轉(zhuǎn)盤的具體代碼,供大家參考,具體內(nèi)容如下
#ifndef LOTTERYTURNTABLEWIDGET_H #define LOTTERYTURNTABLEWIDGET_H ? #include <QWidget> ? class LotteryTurntableWidget : public QWidget { ? ? Q_OBJECT ? ? Q_PROPERTY(int rotate READ getRotate WRITE setRotate MEMBER painterRotate) public: ? ? LotteryTurntableWidget(QWidget *parent = nullptr); ? ? ~LotteryTurntableWidget()override; ? ? int getRotate(); ? ? void setRotate(int rotate); ? protected: ? ? void paintEvent(QPaintEvent *event)override; ? ? void mousePressEvent(QMouseEvent *event)override; ? ? void mouseReleaseEvent(QMouseEvent *event)override; ? private: ? ? QRect centerBtnRect; ? ? bool isPressCenterBtn{false}; ? ? bool isRuning{false}; ? ? int painterRotate{0}; ? ? void onRotateFinished(); ? ? QList<Qt::GlobalColor> colorList; }; #endif // LOTTERYTURNTABLEWIDGET_H
#include "lotteryturntablewidget.h" #include <QPainter> #include <QPaintEvent> #include <QPainterPath> #include <QTime> #include <QDebug> #include <QRandomGenerator> #include <QPropertyAnimation> ? LotteryTurntableWidget::LotteryTurntableWidget(QWidget *parent) ? ? : QWidget(parent) { ? ? setPalette(Qt::white); ? ? setMinimumSize(500,500); ? ? ? colorList << Qt::red << Qt::yellow << Qt::green << Qt::cyan << Qt::blue << Qt::magenta << Qt::darkGreen << Qt::darkCyan; } ? LotteryTurntableWidget::~LotteryTurntableWidget() { } ? int LotteryTurntableWidget::getRotate() { ? ? return painterRotate; } ? void LotteryTurntableWidget::setRotate(int rotate) { ? ? painterRotate = rotate; ? ? update(); } ? void LotteryTurntableWidget::paintEvent(QPaintEvent *event) { ? ? QPainter painter(this); ? ? painter.setRenderHint(QPainter::Antialiasing,true); ?//反走樣開啟 ? ? const auto rect = event->rect(); ? ? auto radius = std::min(rect.width(),rect.height()) / 2 - 25; ? ? ? painter.save(); ? ? painter.translate(rect.center()); //將坐標系的原點設(shè)置為(r,r) ? ? ? QPen pen; ? ? pen.setColor(QColor("#F0630B")); ? ? pen.setWidth(16); ? ? painter.setPen(pen); ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? pen.setColor(QColor("#FF4500")); ? ? pen.setWidth(8); ? ? painter.setPen(pen); ? ? radius -= 8; ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? pen.setColor(QColor("#B71606")); ? ? pen.setWidth(40); ? ? painter.setPen(pen); ? ? radius -= 24; ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? painter.save(); ? ? if(!isRuning) ? ? { ? ? ? ? painter.setPen(Qt::white); ? ? ? ? painter.setBrush(Qt::white); ? ? } ? ? for (int i = 0; i < 20; ++i) ? ? { ? ? ? ? painter.rotate(18.0); ? ? ? ? int smallEllipse; ? ? ? ? if(i % 2 == 0) ? ? ? ? { ? ? ? ? ? ? if(isRuning) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if(painterRotate % 2 == 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? painter.setPen(Qt::red); ? ? ? ? ? ? ? ? ? ? painter.setBrush(Qt::red); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? painter.setPen(Qt::blue); ? ? ? ? ? ? ? ? ? ? painter.setBrush(Qt::blue); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? smallEllipse = 15; ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? if(isRuning) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if(painterRotate % 2 == 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? painter.setPen(Qt::blue); ? ? ? ? ? ? ? ? ? ? painter.setBrush(Qt::blue); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? painter.setPen(Qt::red); ? ? ? ? ? ? ? ? ? ? painter.setBrush(Qt::red); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? smallEllipse = 10; ? ? ? ? } ? ? ? ? painter.drawEllipse(QPoint(radius, 0), smallEllipse, smallEllipse); ? ? } ? ? painter.restore(); ? ? ? pen.setColor(QColor("#FFC228")); ? ? pen.setWidth(20); ? ? painter.setPen(pen); ? ? radius -= 30; ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? radius -= 10; ? ? auto centerRect = QRect(-radius,-radius,radius * 2,radius * 2); ? ? ? painter.setPen(Qt::transparent); ? ? painter.save(); ? ? painter.rotate(18.0 * painterRotate); ? ? for (int i = 0;i < 8;++i) ? ? { ? ? ? ? QPainterPath path; ? ? ? ? path.moveTo(0,0); ? ? ? ? path.arcTo(centerRect, 45 * i,45); ? ? ? ? path.closeSubpath(); ? ? ? ? painter.fillPath(path,colorList[i]); ? ? } ? ? ? ? painter.restore(); ? ? ? QPainterPath trianglePath;//三角形 ? ? QPolygon polygon; ? ? polygon.append(QPoint(0,-radius * 0.55)); ? ? polygon.append(QPoint(-radius * 0.25,0)); ? ? polygon.append(QPoint(radius * 0.25,0)); ? ? trianglePath.addPolygon(polygon); ? ? painter.setBrush(QColor("#EEDAA2")); ? ? painter.drawPath(trianglePath); ? ? ? painter.setBrush(QColor("#FDFAEA")); ? ? radius = static_cast<int>(radius * 0.3); ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? painter.setBrush(isPressCenterBtn ? QColor("#B91A0D").lighter() : QColor("#B91A0D"));//中間的按鈕 ? ? radius -= 2; ? ? painter.drawEllipse(QPoint(0, 0), radius, radius); ? ? ? centerBtnRect = QRect(rect.width() / 2 - radius,rect.height() / 2 - radius,radius * 2,radius * 2); ? ? painter.restore(); } ? void LotteryTurntableWidget::mousePressEvent(QMouseEvent *event) { ? ? if(isRuning) ? ? { ? ? ? ? QWidget::mousePressEvent(event); ? ? ? ? return; ? ? } ? ? QRegion ellipseRegion(centerBtnRect, QRegion::Ellipse); ? ? isPressCenterBtn = ellipseRegion.contains(event->pos()); ? ? if(isPressCenterBtn) ? ? { ? ? ? ? isRuning = true; ? ? ? ? ? QPropertyAnimation *animation = new QPropertyAnimation(this, "rotate"); ? ? ? ? animation->setEasingCurve(QEasingCurve::InOutCubic); ? ? ? ? animation->setDuration(3000); ? ? ? ? animation->setStartValue(0); ? ? ? ? animation->setEndValue(QRandomGenerator::global()->bounded(360) + 360 * 5); ? ? ? ? connect(animation, &QAbstractAnimation::finished, this, &LotteryTurntableWidget::onRotateFinished); ? ? ? ? animation->start(QAbstractAnimation::DeleteWhenStopped); ? ? ? ? update(); ? ? } ? ? QWidget::mousePressEvent(event); } ? void LotteryTurntableWidget::mouseReleaseEvent(QMouseEvent *event) { ? ? if(isPressCenterBtn) ? ? { ? ? ? ? isPressCenterBtn = false; ? ? ? ? update(); ? ? } ? ? QWidget::mouseReleaseEvent(event); } ? void LotteryTurntableWidget::onRotateFinished() { ? ? isRuning = false; }
效果:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針
這篇文章主要介紹了C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針的用法,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09淺談C++內(nèi)存分配及變長數(shù)組的動態(tài)分配
下面小編就為大家?guī)硪黄獪\談C++內(nèi)存分配及變長數(shù)組的動態(tài)分配。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09C++?QT?QThread啟動、停止、暫停和恢復的實現(xiàn)
本文主要介紹了C++?QT?QThread啟動、停止、暫停和恢復的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細講解
這篇文章主要介紹了C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-11-11解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法
本篇文章是對如何在C語言中調(diào)用shell命令的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05