網站首頁 編程語言 正文
首先來看一下效果:
大概就是這樣子,需要注意的是,這里你需要創建一個基類為Widget的界面來繪制時鐘,以至于后期你想把這個時鐘放到任意一個界面,你只需要在那個界面的ui里面添加一個widget,然后將它提升為這個時鐘界面,并設定它的大小。
widget.h文件
#ifndef WIDGET_H #define WIDGET_H #include<math.h> #include<QResizeEvent> #include<QGroupBox> #include<QTimer> #include<QTime> #include<QPainter> #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: void paintEvent(QPaintEvent *event); private: Ui::Widget *ui; }; #endif // WIDGET_H
widget.cpp文件
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QTimer *timer = new QTimer(this); //連接信號與槽 connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(1000); //設置窗體名稱與大小 setWindowTitle(tr("Clock")); ui->setupUi(this); resize(350,350); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *event) { static const QPoint hourHand[3] = { QPoint(5, 14), QPoint(-5, 14), QPoint(0, -50) }; static const QPoint minuteHand[3] = { QPoint(5, 14), QPoint(-5,14), QPoint(0, -70) }; static const QPoint secondHand[3] = { QPoint(5, 14), QPoint(-5, 14), QPoint(0, -80) }; static const QPoint line_long[2]= { QPoint(0,100), QPoint(0,80) }; static const QPoint line_short[2]={ QPoint(0,100), QPoint(0,95) }; //繪制的范圍 int side = qMin(width(), height()); //獲取當前的時間 QTime time = QTime::currentTime(); //聲明用來繪圖用的painter QPainter painter(this); //繪制的圖像反鋸齒 painter.setRenderHint(QPainter::Antialiasing); //重新定位坐標起始點,把坐標原點放到窗體的中央 painter.translate(width() / 2, height() / 2); //在表盤內添加文字(任意) //painter.drawText(-75,-120,100,170,Qt::AlignRight,tr("ROLEX")); //設定畫布的邊界 painter.scale(side / 200.0, side / 200.0); //填充邊線設為黑色,也可以設置為NoPen painter.setPen( Qt::black ); //畫刷顏色設定 painter.setBrush(Qt::black); //保存painter的狀態 painter.save(); //設置painter的旋轉角度 painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //填充時針的區域 painter.drawConvexPolygon(hourHand, 3); painter.restore(); painter.setPen(Qt::black); //12個個刻度循環 for (int i = 0; i < 12; ++i) { painter.drawLine(line_long[0],line_long[1]); painter.rotate(30.0); } //繪制分針轉角、刻度 painter.setPen(Qt::black); painter.setBrush(Qt::black); painter.save(); painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); painter.drawConvexPolygon(minuteHand, 3); painter.restore(); painter.setPen(Qt::black); for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) painter.drawLine(line_short[0],line_short[1]); painter.rotate(6.0); } //繪制分針轉角、刻度 painter.setPen(Qt::black); painter.setBrush(Qt::black); painter.save(); painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); painter.drawConvexPolygon(minuteHand, 3); painter.restore(); painter.setPen(Qt::black); for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) painter.drawLine(line_short[0],line_short[1]); painter.rotate(6.0); } //繪制秒針轉角 painter.setPen(Qt::black); painter.setBrush(Qt::black); painter.save(); painter.rotate(6.0*time.second()); painter.drawConvexPolygon(secondHand,3); painter.restore(); }
main.cpp文件
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
原文鏈接:https://blog.csdn.net/qq_44943840/article/details/122211863
相關推薦
- 2022-07-31 pandas中提取DataFrame某些列的一些方法_python
- 2024-01-29 使用 Maven 進行項目構建:深入了解 `mvn clean install -U` 命令
- 2022-02-27 Web server failed to start. Port 8989 was already
- 2022-06-27 Python數據類型和常用操作_python
- 2022-07-21 windows與Linux查看端口占用并終止端口占用
- 2022-10-09 C#使用Enum.TryParse()實現枚舉安全轉換_C#教程
- 2023-01-02 Kotlin?FrameLayout與ViewPager2控件實現滾動廣告欄方法_Android
- 2022-08-19 一篇文章讓你看懂用git上傳文件至gitee,結尾有.gitignore配置
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支