QT實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘效果
本文實(shí)例為大家分享了QT實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘效果的具體代碼,供大家參考,具體內(nèi)容如下
先上效果圖:
預(yù)備知識(shí):
一.鐘表實(shí)現(xiàn)原理
設(shè)置定時(shí)器timer,每隔1000毫秒(即1s)發(fā)送timeout()信號(hào)到槽函數(shù)update(),重繪事件函數(shù)paintEvent(QPaintEventevent)
二.鐘表的繪制方法
拆分鐘表:表盤(pán) 數(shù)字 刻度線 指針
paintEvent(QPaintEventevent)
1.設(shè)置定時(shí)器,時(shí)間間隔為1000毫秒,并且將定時(shí)器時(shí)間與update函數(shù)關(guān)聯(lián)為信號(hào)和槽,定時(shí)器每隔1秒發(fā)送一個(gè)信號(hào)
2.繪制時(shí)針?lè)轴樏脶樀男螤睢?/p>
// 時(shí)針、分針、秒針 - 多邊形 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.繪制時(shí)針和時(shí)刻度線
// 繪制時(shí)針 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); // 繪制時(shí)刻度線 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);
下面是一些基礎(chǔ)的繪圖函數(shù):
drawPoint() 繪制點(diǎn)
drawLine() 繪制線
drawRect() 繪制矩形
drawEllipse() 繪制橢圓(繪制圓也是此函數(shù))
drawConvexPolygon() 繪制凸多邊形
drawText() 編制文本
特別的,我們還會(huì)經(jīng)常用到
QPen:繪制幾何圖形的邊緣,可繪制顏色,寬度,線的風(fēng)格等
QBrush:用于幾何圖形的調(diào)色板與填充
則可借用setPen()來(lái)當(dāng)做畫(huà)筆來(lái)使用。
setBrush()來(lái)當(dāng)做填充器使用來(lái)填充顏色。
setPen(color);
然后我們的繪制將會(huì)用此顏色的畫(huà)筆來(lái)繪制圖形邊緣。
setBrush(color);
主要代碼展示:
void Widget::drawhourhand(QPainter*painter) { QTime time=QTime::currentTime(); painter->setBrush(Qt::blue);//畫(huà)刷,填充 painter->setPen(Qt::Dense7Pattern);//畫(huà)筆,制作廓線 painter->save(); painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指針旋轉(zhuǎn)到當(dāng)前時(shí)間位置 painter->drawConvexPolygon(hourhand,4);;//繪制時(shí)針(凸多邊形) painter->restore();//與save連著用 繪制圖形后復(fù)位坐標(biāo)系 } 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);//畫(huà)刷,填充 painter->setPen(Qt::Dense7Pattern);//畫(huà)筆,制作廓線 painter->save(); painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指針旋轉(zhuǎn)到當(dāng)前時(shí)間位置 painter->drawConvexPolygon(hourhand,4);;//繪制時(shí)針(凸多邊形) painter->restore();//與save連著用 繪制圖形后復(fù)位坐標(biāo)系 } 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);//重新設(shè)定坐標(biāo)原點(diǎn) drawhourhand(&painter); drawminutehand(&painter); drawsecondhand(&painter); drawclockdial(&painter); QString timeStr= QTime::currentTime().toString(); //繪制當(dāng)前的電子時(shí)間 painter.setPen(Qt::white); painter.drawText(-20,30,80,30,0,timeStr); painter.setBrush(Qt::black); painter.drawEllipse(QPoint(0,0),3,3);//中間畫(huà)個(gè)小圓點(diǎn) // QTransform Transform; // Transform.rotate(90); // painter.setTransform(Transform); painter.drawText(-53,-30,QStringLiteral("老子利指導(dǎo),殺人先看表")); } void Widget::drawclockdial(QPainter*painter) { hourhandpen.setColor(Qt::white); hourhandpen.setWidth(2.0);//設(shè)置小時(shí)刻度線為粗黑 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);//原點(diǎn)變了 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(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言中初始、增加和刪除進(jìn)程信號(hào)的操作方法簡(jiǎn)介
這篇文章主要介紹了C語(yǔ)言中初始、增加和刪除進(jìn)程信號(hào)的操作方法簡(jiǎn)介,分別是sigemptyset函數(shù)、sigaddset函數(shù)和sigdelset函數(shù)的用法,需要的朋友可以參考下2015-09-09使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例
這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05C++中成員函數(shù)和友元函數(shù)的使用及區(qū)別詳解
大家好,本篇文章主要講的是C++中成員函數(shù)和友元函數(shù)的使用及區(qū)別詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01基于c++11的event-driven library的理解
這篇文章主要介紹了基于c++11的event-driven library的理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車違章處罰管理系統(tǒng)
這篇文章主要介紹了基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車違章處罰管理系統(tǒng)的相關(guān)資料,需要的朋友可以參考下2016-07-07如何基于 Blueprint 在游戲中創(chuàng)建實(shí)時(shí)音視頻功能
我們?cè)诒疚南葋?lái)講講如何在 Unreal 中用 Blueprint 快速實(shí)現(xiàn)。稍后會(huì)分享基于 C++的實(shí)現(xiàn)步驟。感興趣的朋友跟隨小編一起看看吧2020-05-0564位linux 編譯c提示gnu/stubs-32.h:No such file or directory的解決方法
這篇文章主要介紹了64位linux 編譯c提示gnu/stubs-32.h:No such file or directory的解決方法,需要的朋友可以參考下2020-03-03C++右值引用與move和forward函數(shù)的使用詳解
為了支持移動(dòng)操作,新標(biāo)準(zhǔn)引入了一種新的引用類型——右值引用(rvalue reference)。所謂右值引用就是必須綁定到右值的引用,這篇文章主要介紹了C++右值引用與move和forward的使用2022-08-08