QT 동적 시계 구현

5332 단어 QT클 록
본 논문 의 사례 는 QT 가 동적 시 계 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
QT 를 처음 배 웠 는데 이번에 QT 로 동적 그림 제작 을 실 현 했 고 간단 하고 쉬 운 시 계 를 성공 적 으로 만 들 었 습 니 다.효 과 는 그림 과 같 습 니 다.

100 배 효과 가속
사용 하 는 배경 그림 은 다음 과 같 습 니 다(소 재 는 바 이 두 그림 에서 기원 합 니 다).

코드,원 리 는 다음 과 같다.
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
 Q_OBJECT

public:
 MainWindow(QWidget *parent = nullptr);
 ~MainWindow();
 void paintEvent(QPaintEvent *event); //  paintEvent  
 void timerEvent(QTimerEvent *event); //  timerEvent  

private:
 Ui::MainWindow *ui;
 int second=0; //             
 double minute=0,hour=0;//           ,      
 QPixmap pic; //           
};
#endif // MAINWINDOW_H
main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 MainWindow w;
 w.show();
 return a.exec();
}
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPainter>
#define PI 3.1415926
#define WIDE 1000
#define HIGHT 1000
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
 , ui(new Ui::MainWindow)
{
 ui->setupUi(this);
 resize(WIDE,HIGHT);
 startTimer(1000);

}

MainWindow::~MainWindow()
{
 delete ui;
}
void MainWindow::timerEvent(QTimerEvent *event)//         
{
 second+=6;  //    +6°
 minute+=0.1; //    +0.1°(    /60)
 hour+=0.0016666667; //    +0.0016666667°(    /3600)
 repaint();
}
void MainWindow::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 QPixmap pix(":/new/prefix1/1.png"); //      
 pic=pix;
 QRect p(0,0,1000,1000);
 QRect p2(0,0,1000,1000);
 painter.drawPixmap(p2,pic,p);  //        (0,0)     
 painter.translate(WIDE/2-10,HIGHT/2); //         (WIDE/2-10,HIGHT/2)(          ,                    )
 painter.drawEllipse(QPoint(10,0),327,327);
 painter.setBrush(QBrush(QColor(0,0,0)));
 painter.drawEllipse(QPoint(0,0),10,10);
 for (int i=1;i<=12;i++)
 {
  QFont font;      //    
  font.setPointSize(17); //      
  font.setFamily("Microsoft YaHei"); //      
  font.setLetterSpacing(QFont::AbsoluteSpacing,0);
  painter.setFont(font);
  QString s=QString("%1").arg(i); // int   i   Qstring     drawText      
  painter.drawText(QPoint(290*cos(PI*(i-1)/6-PI/3),290*sin(PI*(i-1)/6-PI/3)+10),s);    //   1-12           ,290                  30°
 }
 for (int i=0;i<=60;i++) //                
 {
  painter.translate(WIDE/2,HIGHT/2); //       (WIDE/2,HIGHT/2)
  if(i*12<255) //              ,       i     rgb              
  {
   painter.setBrush(QBrush(QColor(0,0,i*12)));  
  }
  else if(i*12>255&i*12<510)
  {
   painter.setBrush(QBrush(QColor(0,((42-i)*12)%255,0)));
  }
  else
  {
   painter.setBrush(QBrush(QColor(((63-i)*12)%255,0,0)));
  }
  if(i%5==0)  // i 5                   rotate                            
  {
   painter.rotate(6*i);
   painter.drawRect(0,327,4,-30);

  }
  else
  {
   painter.rotate(6*i);
   painter.drawRect(0,327,2,-20);
  }
  painter.resetTransform(); //      
 }
 painter.setBrush(QBrush(QColor(0,0,0))); //       
  painter.translate(WIDE/2-10,HIGHT/2); //    
 painter.rotate(second);  //                     
 painter.drawRect(-5,-320,10,320);
 painter.resetTransform();
 painter.translate(WIDE/2-10,HIGHT/2); //    
 painter.rotate(minute);
 painter.drawRect(-3,-300,6,300);
 painter.resetTransform();
 painter.translate(WIDE/2-10,HIGHT/2); //    
 painter.rotate(hour);
 painter.drawRect(-7,-180,14,180);
 painter.resetTransform();

}
주의 점:
1.painter.translate(WIDE/2,HIGHT/2);
그림 의 원점 을 설정 하고 사용 후 다음 그림 의 좌 표 는 괄호 안의 좌 표를 원점 으로 그림 을 그립 니 다.painter.resetTransform()함 수 를 사용 할 때 까지.
2.painter.rotate()시계 바늘 즉 눈금 선 은 모두 rotate()함수 로 회전 하여 그립 니 다.
3.painter.setBrush(QBrush(QColor(0,0,0)));
QBrush()설정 브러시
QColor(0,0,0)설정 rgb 색상 의 세 가지 매개 변 수 는 모두 0 이 검은색 이 고 전체 255 가 흰색 이 며 개인의 취향 에 따라 조정 할 수 있 습 니 다.
4.second+=6; //초침 눈금+6°
minute+=0.1; //초침 눈금+0.1°(초침 속도/60)
hour+=0.0016666667; //초침 눈금+0.0016666667°(초침 속도/3600)
시침,분침,초침 간 의 관 계 를 잘 조절 하 세 요.
5.repaint()는 1 초 에 repaint()함 수 를 호출 하여 시계의 다음 상 태 를 그립 니 다.
6.기타 상세 정 보 는 코드 내 주석 을 참고 하 시기 바 랍 니 다.
글 에 오류 나 코드 가 있 으 면 더 좋 은 방법 이 있 습 니 다.비판 지적 을 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기