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.기타 상세 정 보 는 코드 내 주석 을 참고 하 시기 바 랍 니 다.
글 에 오류 나 코드 가 있 으 면 더 좋 은 방법 이 있 습 니 다.비판 지적 을 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
qt 초급 오류: 헤더 파일에서 정의, cpp가 실행되지 않았습니다.문제 :-1: error: symbol(s) not found for architecture x86_64 :-1: error: linker command failed with exit code 1 (use -v to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.