QT 用 paintEvent 实现绘制钟表的列子
2016-06-08 11:35
246 查看
参见列子: C:\Qt\Qt5.5.1\Examples\Qt-5.5\widgets\widgets\shapedclock\shapedclock.pro
下面是效果图:
![](https://img-blog.csdn.net/20160608113342570?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面是代码:
#ifndef SHAPEDCLOCK_H
#define SHAPEDCLOCK_H
#include <QWidget>
//! [0]
class ShapedClock : public QWidget
{
Q_OBJECT
public:
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
下面是效果图:
下面是代码:
#ifndef SHAPEDCLOCK_H
#define SHAPEDCLOCK_H
#include <QWidget>
//! [0]
class ShapedClock : public QWidget
{
Q_OBJECT
public:
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(); }
相关文章推荐
- Ubuntu arm-qt4.8.5 的安装与配置
- QT-IPC-内存共享
- Qt之OpenSSL
- Qt之OpenSSL
- Qt Icon from Pixmap from data.一款好友列表demo
- Qt学习笔记
- Qt之StyleSheet用法
- QTableWidget常用(转载)
- Qt里怎么处理二进制数据
- 查看Qt中可用的数据库插件
- QT里添加图标复制到另外电脑后不显示解决方法
- Qt下的udp编程
- Qt 在win中使用第三方库的使用方法
- PyQt5学习笔记003——Qt的架构
- Qt 学习使用qt
- Qt下实现的炉石计算器
- qt/e5.6.0 ubuntu16.04 make问题
- qt creator : error: Exception at 0x772e93d0, code: 0xc0000409: , flags=0x1 (execution cannot be c
- volley(5) 参数total_remain:totalqty, data:[{ bar_status:XX , bar_code: "XX",bar_remain:XX, bar_whcode:"XX" , bar_prodcode:"XX",bar_id:XX,bar_location: "XX", pr_detail: "XX" , bar_batchcode:method:POST
- 在学习QT过程中调试slot出现的问题