QT實現(xiàn)簡單時鐘效果
本文實例為大家分享了QT實現(xiàn)簡單時鐘效果的具體代碼,供大家參考,具體內(nèi)容如下
先上效果圖:

預備知識:
一.鐘表實現(xiàn)原理
設置定時器timer,每隔1000毫秒(即1s)發(fā)送timeout()信號到槽函數(shù)update(),重繪事件函數(shù)paintEvent(QPaintEventevent)
二.鐘表的繪制方法
拆分鐘表:表盤 數(shù)字 刻度線 指針
paintEvent(QPaintEventevent)
1.設置定時器,時間間隔為1000毫秒,并且將定時器時間與update函數(shù)關聯(lián)為信號和槽,定時器每隔1秒發(fā)送一個信號
2.繪制時針分針秒針的形狀。
// 時針、分針、秒針 - 多邊形
static const QPoint hourHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -40)
};
static const QPoint minuteHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -65)
};
static const QPoint secondHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -80)
};
3.繪制時針和時刻度線
// 繪制時針
painter.setPen(Qt::NoPen);
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);
}
QFont font = painter.font();
font.setBold(true);
painter.setFont(font);
下面是一些基礎的繪圖函數(shù):
drawPoint() 繪制點
drawLine() 繪制線
drawRect() 繪制矩形
drawEllipse() 繪制橢圓(繪制圓也是此函數(shù))
drawConvexPolygon() 繪制凸多邊形
drawText() 編制文本
特別的,我們還會經(jīng)常用到
QPen:繪制幾何圖形的邊緣,可繪制顏色,寬度,線的風格等
QBrush:用于幾何圖形的調(diào)色板與填充
則可借用setPen()來當做畫筆來使用。
setBrush()來當做填充器使用來填充顏色。
setPen(color);
然后我們的繪制將會用此顏色的畫筆來繪制圖形邊緣。
setBrush(color);
主要代碼展示:
void Widget::drawhourhand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::blue);//畫刷,填充
painter->setPen(Qt::Dense7Pattern);//畫筆,制作廓線
painter->save();
painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指針旋轉到當前時間位置
painter->drawConvexPolygon(hourhand,4);;//繪制時針(凸多邊形)
painter->restore();//與save連著用 繪制圖形后復位坐標系
}
void Widget::drawminutehand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::white);
painter->setPen(Qt::Dense5Pattern);
painter->save();
painter->rotate(6.0*(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(minutehand,4);
painter->restore();
}
void Widget::drawsecondhand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::red);
painter->setPen(Qt::Dense5Pattern);
painter->save();
painter->rotate(6*time.second());
painter->drawPolygon(minutehand,4);
painter->restore();
}
``
```cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
font.setPixelSize(10);
setFont(font);
setWindowTitle("THE CLOCK");
resize(1200,820);
}
Widget::~Widget()
{
delete ui;
}
const QPoint Widget::hourhand[4]={
QPoint(5,5),QPoint(0,13),QPoint(-5,5),QPoint(0,-40)
};
const QPoint Widget::minutehand[4]={
QPoint(3,5),QPoint(0,16),QPoint(-3,5),QPoint(0,-70)
};
const QPoint Widget::secondhand[4]={
QPoint(0,0),QPoint(0,0),QPoint(0,0),QPoint(0,0)
};
void Widget::drawhourhand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::blue);//畫刷,填充
painter->setPen(Qt::Dense7Pattern);//畫筆,制作廓線
painter->save();
painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指針旋轉到當前時間位置
painter->drawConvexPolygon(hourhand,4);;//繪制時針(凸多邊形)
painter->restore();//與save連著用 繪制圖形后復位坐標系
}
void Widget::drawminutehand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::white);
painter->setPen(Qt::Dense5Pattern);
painter->save();
painter->rotate(6.0*(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(minutehand,4);
painter->restore();
}
void Widget::drawsecondhand(QPainter*painter)
{
QTime time=QTime::currentTime();
painter->setBrush(Qt::red);
painter->setPen(Qt::Dense5Pattern);
painter->save();
painter->rotate(6.0*time.second());
painter->drawPolygon(minutehand,4);
painter->restore();
}
void Widget::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
QTimer*timer=new QTimer(this);
timer->start(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
QPixmap map(":/new/prefix1/timg (1).jfif");
QRect q(0,0,1200,800);//截取這么大的面積
QRect q2(0,0,width(),height());//放到指定大小的框中
painter.drawPixmap(q2,map,q);
painter.setRenderHint(QPainter::Antialiasing,true);//反走樣
int side=qMin(width(),height());
painter.setWindow(0,0,230,230);//原本截取放大的面積區(qū)域多大
painter.setViewport(96,0,side,side);//映射到新的區(qū)域面積多大
painter.translate(100,100);//重新設定坐標原點
drawhourhand(&painter);
drawminutehand(&painter);
drawsecondhand(&painter);
drawclockdial(&painter);
QString timeStr= QTime::currentTime().toString(); //繪制當前的電子時間
painter.setPen(Qt::white);
painter.drawText(-20,30,80,30,0,timeStr);
painter.setBrush(Qt::black);
painter.drawEllipse(QPoint(0,0),3,3);//中間畫個小圓點
// QTransform Transform;
// Transform.rotate(90);
// painter.setTransform(Transform);
painter.drawText(-53,-30,QStringLiteral("老子利指導,殺人先看表"));
}
void Widget::drawclockdial(QPainter*painter)
{
hourhandpen.setColor(Qt::white);
hourhandpen.setWidth(2.0);//設置小時刻度線為粗黑
minutehandpen.setColor(Qt::white);
for(int i=1;i<=60;i++)
{
painter->save();
painter->rotate(6*i);
if(i%5==0)
{
painter->setPen(hourhandpen);
painter->drawLine(0,-98,0,-82);//原點變了
painter->drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(i/5));
}
else
{
painter->setPen(minutehandpen);
painter->drawLine(0,-98,0,-88);
}
painter->restore();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++實現(xiàn)ETW進行進程變動監(jiān)控詳解
ETW提供了一種對用戶層應用程序和內(nèi)核層驅動創(chuàng)建的事件對象的跟蹤記錄機制。為開發(fā)者提供了一套快速、可靠、通用的一系列事件跟蹤特性。本文將利用ETW進行進程變動監(jiān)控,需要的可以參考一下2022-07-07

