本文例項為大家分享了QT實現簡單時鐘效果的具體程式碼,供大家參考,具體內容如下
先上效果圖:
預備知識:
一.鐘錶實現原理
設定定時器timer,每隔1000毫秒(即1s)傳送timeout()訊號到槽函式update(),重繪事件函式paintEvent(QPaintEventevent)
二.鐘錶的繪製方法
拆分鐘表:錶盤 數字 刻度線 指標
paintEvent(QPaintEventevent)
1.設定定時器,時間間隔為1000毫秒,並且將定時器時間與update函式關聯為訊號和槽,定時器每隔1秒傳送一個訊號
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);
下面是一些基礎的繪圖函式:
drawPoint() 繪製點
drawLine() 繪製線
drawRect() 繪製矩形
drawEllipse() 繪製橢圓(繪製圓也是此函式)
drawConvexPolygon() 繪製凸多邊形
drawText() 編制文字
特別的,我們還會經常用到
QPen:繪製幾何圖形的邊緣,可繪製顏色,寬度,線的風格等
QBrush:用於幾何圖形的調色盤與填充
則可借用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);//原本擷取放大的面積區域多大 painter.setViewport(96,0,side,side);//對映到新的區域面積多大 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;isave(); 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(); } }
[limiyoyo ] QT實現簡單時鐘效果已經有252次圍觀