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
- QT 用 paintEvent 实现绘制钟表的列子
- Qt paintEvent绘制窗体
- QT 绘制事件 PaintEvent
- QT 钟表的实现
- Qt PaintEvent 绘制窗体背景图片
- QT 绘制按钮 paintEvent enterEvent leaseEvent mouseEvent
- Qt paintevent的调用机制
- Qt paintEvent和QTimer更新的问题
- qt中绘图事件paintEvent 的用法
- 绘制钟表
- Android 钟表的实现
- 图形钟表的实现
- 用js实现钟表
- Qt paintevent事件
- Qt paintevent事件
- Qt paintevent 事件
- 【引用】qt QEvent paintEvent
- Qt paintevent事件
- leetcode(300)—— Longest Increasing Subsequence(最长递增子序列)
- 为什么响应式编程并非一时之势?
- 通过ADB操作/查看SQLite数据库以及Mac OS X下adb shell配置与启动
- JS 继承
- [libtool] autogen时AM_PATH_GLIB_2_0错误的处理
- QT 用 paintEvent 实现绘制钟表的列子
- Android 下led 的控制(上)--Android部分
- 关于个人博客开源系统的碎碎念
- 大话分布式数据库HBASE
- LInux常用压缩与解压缩命令
- Swift模拟从服务区端加载指定的控制器类型
- JS获取URL传递过来的参数值
- liunx设置自启动之chkconfig命令详解
- 进程调度