Qt 간단 한 동적 시계 구현

6846 단어 Qt클 록
본 논문 의 사례 는 Qt 가 간단 한 동적 시 계 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
퀘 스 트 구현:
Qt 언어 로 타 이 머 를 사용 하여 간단 한 동적 시 계 를 실현 합 니 다.
구현 효과:

실현 과정:
전체 과정 은 주로 두 부분 으로 나 뉜 다.
1.시계 판 에 필요 한 요 소 를 그립 니 다.시 분 초 바늘,눈금,시계 배경 그림 도 삽입 할 수 있 습 니 다.
2.그 려 진 바늘 을 움 직 이게 합 니 다(타 이 머 를 사용 하고 시스템 시간 을 연결 합 니 다).
전체 코드:
dialog.h

#ifndef DIALOG_H
#define DIALOG_H


#include <QDialog>


QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE


class Dialog : public QDialog
{
  Q_OBJECT


public:
  Dialog(QWidget *parent = nullptr);
  ~Dialog();



  void paintEvent(QPaintEvent *event);


  void drawSecond(QPainter *painter);


  void drawMinute(QPainter *painter);


  void drawHour(QPainter *painter);


  void drawClock(QPainter *painter);


private:
  Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QPainter>
#include <QTime>
#include <QTimer>
#include <QPixmap>
#include <QPen>



Dialog::Dialog(QWidget *parent)
  : QDialog(parent)
  , ui(new Ui::Dialog)
{
  ui->setupUi(this);


  resize(959,959);


  setWindowTitle("My Clock");


  QTimer *timer = new QTimer(this);


  timer->start(1000);


  //     
  connect(timer,SIGNAL(timeout()),this,SLOT(update()));


}


Dialog::~Dialog()
{
  delete ui;
}



void Dialog::paintEvent(QPaintEvent *event)
{
  QPainter painter(this);


  QPixmap map(":/Resrouse/Pic.jpg");


  QRect q(0,0,959,959);


  QRect q2(0,0,width(),height());



  painter.drawPixmap(q2,map,q);


  //      
  painter.setRenderHint(QPainter::Antialiasing,true);


  //       ,      
  painter.setWindow(0,0,200,200);


  //            
  painter.translate(100,100);



  //        ,       
  drawClock(&painter);
  drawSecond(&painter);
  drawMinute(&painter);
  drawHour(&painter);


}


void Dialog::drawSecond(QPainter *painter)
{


  static const QPoint Second[4]=
  {
    QPoint(2, 5),
    QPoint(0, 18),
    QPoint(-2, 5),
    QPoint(0, -90)
  };


  //        currentTime();
  QTime time = QTime::currentTime();


  //      
  painter->setBrush(Qt::red);
  painter->setPen(Qt::red);


  //save    
  painter->save();


  //    (        )
  painter->rotate(6.0*time.second());
  painter->drawConvexPolygon(Second,4);


  //ratate    
  painter->restore();

}


void Dialog::drawMinute(QPainter *painter)
{

  static const QPoint Minute[4]=
  {
    QPoint(2, 5),
    QPoint(0, 16),
    QPoint(-2, 5),
    QPoint(0, -70)
  };


  QTime time = QTime::currentTime();



  painter->setBrush(Qt::blue);
  painter->setPen(Qt::blue);



  painter->save();



  painter->rotate(6.0*(time.minute()+time.second()/60.0));
  painter->drawConvexPolygon(Minute,4);


  painter->restore();


}


void Dialog::drawHour(QPainter *painter)
{
  static const QPoint Hour[4]=
  {
    QPoint(2, 5),
    QPoint(0, 13),
    QPoint(-2, 5),
    QPoint(0, -40)
  };


  QTime time = QTime::currentTime();


  painter->setBrush(Qt::yellow);
  painter->setPen(Qt::yellow);


  painter->save();


  painter->rotate(30.0*(time.hour()+time.minute()/60.0));
  painter->drawConvexPolygon(Hour,4);


  painter->restore();


}


void Dialog::drawClock(QPainter *painter)
{
  QPen pen;


  pen.setWidth(2);


  pen.setColor(Qt::white);


  painter->setPen(pen);


  //          
  for (int i = 1; i <=60; ++i)
  {

    painter->save();

    painter->rotate(6*i);//     6 

    //       
    if (i % 5 == 0)
    {

      painter->drawLine(0, -98, 0, -82);
      painter->drawText(-20, -82, 40, 40,Qt::AlignHCenter | Qt::AlignTop,QString::number(i/5));
    }
    else
    {

      painter->drawLine(0, -98, 0, -88);
    }

    painter->restore();//          
  }


}
디스크 그리 기:
paintEvent()함 수 를 사용 하여 각 포인터 의 크기 위 치 를 구조 체 형식 으로 저장 하고 그립 니 다.
다음은 초침 으로 그립 니 다.

void Dialog::drawSecond(QPainter *painter)
{

  static const QPoint Second[4]=
  {
    QPoint(3, 5),
    QPoint(0, 18),
    QPoint(-3, 5),
    QPoint(0, -90)
  };


  //        currentTime();
  QTime time = QTime::currentTime();

  //      
  painter->setBrush(Qt::red);
  painter->setPen(Qt::red);

  //save    
  painter->save();

  //    (        )
  painter->rotate(6.0*time.second());
  painter->drawConvexPolygon(Second,4);

  //ratate    
  painter->restore();

}
호출 시간:
타 이 머 를 1000 ms,즉 1s 로 설정 합 니 다.

QTimer *timer = new QTimer(this);

timer->start(1000);

//     
connect(timer,SIGNAL(timeout()),this,SLOT(update()));

기타:
1.그림 삽입:
map 의 내용 은 자체 가 져 온 자원 파일 로 바 꿀 수 있 습 니 다.

QPixmap map(":/Resrouse/Pic.jpg");

QRect q(0,0,959,959);

QRect q2(0,0,width(),height());

painter.drawPixmap(q2,map,q);
2.색상 변경 그리 기:

QPen pen;
  
//       
pen.setWidth(2); 

//       
pen.setColor(Qt::white);

//         
painter->setPen(pen);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기