歡迎您光臨本站 註冊首頁

QT實現簡單時鐘效果

←手機掃碼閱讀     limiyoyo @ 2020-06-10 , reply:0

本文例項為大家分享了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次圍觀

http://coctec.com/docs/program/show-post-237867.html