QT 用 paintEvent 实现绘制钟表的列子

来源:互联网 发布:网络运维方案 编辑:程序博客网 时间:2024/05/17 01:03

参见列子: C:\Qt\Qt5.5.1\Examples\Qt-5.5\widgets\widgets\shapedclock\shapedclock.pro

下面是效果图:


下面是代码:

#ifndef SHAPEDCLOCK_H#define SHAPEDCLOCK_H#include <QWidget>//! [0]class ShapedClock : public QWidget{    Q_OBJECTpublic:    ShapedClock(QWidget *parent = 0);    QSize sizeHint() const Q_DECL_OVERRIDE;protected:    void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;    void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;private:    QPoint dragPosition;};//! [0]#endif

#include <QtWidgets>#include "shapedclock.h"#define clkAllSize 600//! [0]ShapedClock::ShapedClock(QWidget *parent)    : QWidget(parent, Qt::FramelessWindowHint | Qt::WindowSystemMenuHint){    QTimer *timer = new QTimer(this);    connect(timer, SIGNAL(timeout()), this, SLOT(update()));    timer->start(1000);    QAction *quitAction = new QAction(tr("E&xit"), this);    quitAction->setShortcut(tr("Ctrl+Q"));    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));    addAction(quitAction);    setContextMenuPolicy(Qt::ActionsContextMenu);    //setContextMenuPolicy(Qt::DefaultContextMenu);    setToolTip(tr("Drag the clock with the left mouse button.\n"                  "Use the right mouse button to open a context menu."));    setWindowTitle(tr("Shaped Analog Clock"));}//! [0]//! [1]void ShapedClock::mousePressEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton) {        //qDebug()<<"event->globalPos()"<<event->globalPos();        //qDebug()<<"frameGeometry().topLeft()"<<frameGeometry().topLeft();        dragPosition = event->globalPos() - frameGeometry().topLeft();        //qDebug()<<"dragPosition"<<dragPosition;        event->accept();    }}//! [1]//! [2]void ShapedClock::mouseMoveEvent(QMouseEvent *event){    if (event->buttons() & Qt::LeftButton) {        move(event->globalPos() - dragPosition);        event->accept();    }}//! [2]//! [3]void ShapedClock::paintEvent(QPaintEvent *){    static const QPoint hourHand[3] = {        QPoint(7, 8),        QPoint(-7, 8),        QPoint(0, -40)    };    static const QPoint minuteHand[3] = {        QPoint(7, 8),        QPoint(-7, 8),        QPoint(0, -70)    };    static const QPoint secondHand[3] = {        QPoint(7, 8),        QPoint(-7, 8),        QPoint(0, -100)    };    QColor hourColor(127, 0, 127);    QColor minuteColor(0, 127, 127, 191);    QColor secondColor(127, 127, 0, 191);    int w = width();    int h = height();    int side = qMin(width(), height());// QSize ShapedClock::sizeHint()    QTime time = QTime::currentTime();    QPainter painter(this);    painter.setRenderHint(QPainter::Antialiasing);    //painter.translate(width() / 2, height() / 2);    painter.translate(width() / 2, height() / 2);    painter.scale(side / 200.0, side / 200.0);    //painter.scale(side / 100.0, side / 100.0);    painter.setPen(Qt::NoPen);    //painter.setPen(Qt::DotLine);    painter.setBrush(hourColor);    painter.save();    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));    painter.drawConvexPolygon(hourHand, 3);    painter.restore();    painter.setPen(hourColor);    for (int i = 0; i < 12; ++i) {        painter.drawLine(88, 0, 96, 0);        painter.rotate(30.0);    }    painter.setPen(Qt::NoPen);    painter.setBrush(minuteColor);    painter.save();    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));    painter.drawConvexPolygon(minuteHand, 3);    painter.restore();    painter.setPen(minuteColor);    for (int j = 0; j < 60; ++j) {        if ((j % 5) != 0)            painter.drawLine(92, 0, 96, 0);        painter.rotate(6.0);    }    painter.setPen(Qt::NoPen);    painter.setBrush(secondColor);    painter.save();    painter.rotate(6.0 * (time.second()/* / 60.0*/));    painter.drawConvexPolygon(secondHand, 3);    painter.restore();}//! [3]//! [4]void ShapedClock::resizeEvent(QResizeEvent * /* event */){    int side = qMin(width(), height());    QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,                         side, QRegion::Rectangle /*QRegion::Ellipse*/);    //QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side / 2,                         //side / 2, QRegion::Rectangle /*QRegion::Ellipse*/);    setMask(maskedRegion);}//! [4]//! [5]QSize ShapedClock::sizeHint() const{    return QSize(clkAllSize, clkAllSize);}//! [5]

#include <QApplication>#include "shapedclock.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    ShapedClock clock;    clock.show();    return app.exec();}


0 0
原创粉丝点击