|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
简述
初尝QT不甚欢喜,鱼C上有许多的朋友在为QT做出贡献,我也愿意以主观角度来分享QT,让QT变得更好。
该源码系作者个人撰写,使用时请尊重作者,不要随意篡改关于作者的信息。
版权所有:CSND_Ayo,转载请注明出处:http://blog.csdn.net/csnd_ayo
原帖地址:http://blog.csdn.net/csnd_ayo/article/details/56486455
源码
- #ifndef CUSTOMPROGRESSINDICATOR_H
- #define CUSTOMPROGRESSINDICATOR_H
- #include <QWidget>
- #include <QColor>
- /*
- * 菊花转 进度类,基于代码无需图片资源
- * 作者:陈鲁勇
- * 邮箱:727057301@qq.com
- * 创建时间:2017年2月10日16:26:48
- * QT版本:5.0.2
- * CSDN:http://blog.csdn.net/csnd_ayo
- * **************************************
- * 说明:
- * 使用前请确保在QT.pro中加入 C++11 的支持
- *
- * 示例代码:
- pIndicator = new CustomProgressIndicator(this);
- pIndicator->setColor(Qt::red);
- pIndicator->startAnimation();
- */
- class CustomProgressIndicator : public QWidget
- {
- Q_OBJECT
- Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay)
- Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped)
- Q_PROPERTY(QColor color READ color WRITE setColor)
- public:
- CustomProgressIndicator(QWidget* parent = 0);
- int animationDelay() const { return delay_; }
- /* 动画是否正在进行中 */
- bool isAnimated () const;
- /* 动画完毕后,是否隐藏菊花转 */
- bool isDisplayedWhenStopped() const;
- /* 当前菊花转的颜色 */
- const QColor & color() const { return color_; }
- /* 虚函数:当前大小 */
- virtual QSize sizeHint() const;
- void setBackground(const QString& _icon) {
- currentPix_ = QPixmap(_icon);
- }
- signals:
- void Finished(void);
- public slots:
- /* 开始动画 */
- void startAnimation();
- /* 停止动画 */
- void stopAnimation();
- /* 设置菊花转的转速 */
- void setAnimationDelay(int delay);
- /* 动画完毕后,是否隐藏菊花转 */
- void setDisplayedWhenStopped(bool state);
- /* 设置菊花转颜色 */
- void setColor(const QColor & color);
- /*
- * 进度
- * 参数 _progress:当前进度 0 < _progress < 100
- */
- void onProgress(short _progress) { progress_ = _progress; }
- protected:
- /* 系统基类函数 */
- virtual void timerEvent(QTimerEvent * event);
- virtual void paintEvent(QPaintEvent * event);
- private:
- /* 角度 */
- unsigned int angle_;
- /* 定时器ID */
- int timerId_;
- /* 转速 */
- int delay_;
- /* 是否隐藏 */
- bool displayedWhenStopped_;
- /* 菊花转颜色 */
- QColor color_;
- /* 进度 */
- short progress_;
- /* 背景图 */
- QPixmap currentPix_;
- };
- #endif // CUSTOMPROGRESSINDICATOR_H
复制代码
- #include "customprogressindicator.h"
- #include <QPainter>
- CustomProgressIndicator::CustomProgressIndicator(QWidget* parent)
- : QWidget(parent),
- angle_(0),
- timerId_(-1),
- delay_(20),
- displayedWhenStopped_(false),
- color_(Qt::green) {
- setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- setFocusPolicy(Qt::NoFocus);
- }
- bool CustomProgressIndicator::isAnimated () const {
- return (timerId_ != -1);
- }
- void CustomProgressIndicator::setDisplayedWhenStopped(bool state) {
- displayedWhenStopped_ = state;
- update();
- }
- bool CustomProgressIndicator::isDisplayedWhenStopped() const {
- return displayedWhenStopped_;
- }
- void CustomProgressIndicator::startAnimation() {
- angle_ = 0;
- if (timerId_ == -1) {
- timerId_ = startTimer(delay_);
- }
- }
- void CustomProgressIndicator::stopAnimation() {
- if (timerId_ != -1) {
- killTimer(timerId_);
- }
- timerId_ = -1;
- update();
- }
- void CustomProgressIndicator::setAnimationDelay(int delay) {
- if (timerId_ != -1){
- killTimer(timerId_);
- }
- delay_ = delay;
- if (timerId_ != -1){
- timerId_ = startTimer(delay_);
- }
- }
- void CustomProgressIndicator::setColor(const QColor & color) {
- color_ = color;
- update();
- }
- QSize CustomProgressIndicator::sizeHint() const {
- return QSize(25,25);
- }
- void CustomProgressIndicator::timerEvent(QTimerEvent * /*event*/) {
- angle_ = (angle_+30)%360;
- update();
- }
- void CustomProgressIndicator::paintEvent(QPaintEvent * /*event*/) {
- QPainter p(this);
- p.setRenderHint(QPainter::Antialiasing);
- if (!displayedWhenStopped_ && !isAnimated()) {
- p.drawPixmap(rect(),currentPix_);
- return;
- }
- int width = qMin(this->width(), this->height());
- int outerRadius = (width-1) >> 1;
- int innerRadius = ((width-1) >> 1)*0.38;
- int capsuleHeight = outerRadius - innerRadius;
- int capsuleWidth = (width > 32 ) ? capsuleHeight *.23 : capsuleHeight *.35;
- int capsuleRadius = capsuleWidth >> 1;
- /* 撰写进度 */
- if (progress_ > 0 && progress_ < 100) {
- p.setPen(color_);
- p.drawText(rect(), Qt::AlignCenter, QString("%1%").arg(progress_));
- }
- else if (progress_ == 100) {
- stopAnimation();
- }
- for (int i=0; i<12; ++i) {
- QColor color = color_;
- color.setAlphaF(1.0f - (i/12.0f));
- p.setPen(Qt::NoPen);
- p.setBrush(color);
- p.save();
- p.translate(rect().center());
- p.rotate(angle_ - i*30.0f);
- p.drawRoundedRect(((-capsuleWidth) >> 1), -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius);
- p.restore();
- }
- }
复制代码
|
|