#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QGroupBox> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void paintEvent(QPaintEvent *event); void mouseMoveEvent(QMouseEvent *event); QRectF textRectF(double radius, int pointSize, double angle); private: int m_x; int m_y; Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGridLayout>
#include<cmath>
#include <QRectF>
#include <QPainter>
#include <QTimer>
#include <QTime>
#include <QPaintEvent>
#include <QDebug>
#include <complex>
#include <QPoint>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
QRectF MainWindow::textRectF(double radius, int pointSize, double angle)
{
QRectF rectF;
rectF.setX(radius*cos(angle*3.1415/180.0) - pointSize*2);
rectF.setY(radius*sin(angle*3.1415/180.0) - pointSize/2.0);
rectF.setWidth(pointSize*4);
rectF.setHeight(pointSize);
return rectF;
}
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
// 时针、分针、秒针颜色
QColor hourColor(200, 100, 0, 200);
QColor minuteColor(0, 127, 127, 150);
//设置宽度表盘
int side = qMin(width(), height());
//定义一个painter
QPainter painter(this);
//设置
painter.setRenderHint(QPainter::Antialiasing);
// 平移坐标系原点至中心点
painter.translate(width() / 2, height() / 2);
// 缩放
painter.scale(side / 200.0, side / 200.0);
//使复原
// painter.restore();
//重新设置颜色
painter.setPen(hourColor);
// 绘制小时线 (360度 / 12 = 30度)
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 96, 0);
painter.rotate(30.0);
}
painter.drawLine(0, -65, 0, 65);
painter.drawLine(65, 0, -65, 0);//画交叉线
painter.setPen(QPen(QColor(0, 160, 230), 2));
painter.drawEllipse(QPoint(m_x-width() / 2,m_y-height() / 2), 10, 10);//画圆
// qDebug()<<m_x;
// qDebug()<<m_x;
if(abs(m_x-width()/2)<60&&abs(m_y-height()/2)<60)
{
painter.drawLine(-4, 4, -4,13);
painter.drawLine(-4, 4, -13,4);
painter.drawLine(4, 4, 4,13);
painter.drawLine(4, 4, 13,4);
painter.drawLine(4, -4, 13,-4);
painter.drawLine(4, -4, 4,-13);
painter.drawLine(-4, -4, -4,-13);
painter.drawLine(-4, -4, -13,-4);
}
//设置分钟线颜色
painter.setPen(minuteColor);
// 绘制分钟线 (360度 / 60 = 6度)
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
{
painter.drawLine(92, 0, 96, 0);
}
painter.rotate(6.0);
}
painter.setPen(hourColor);
//设置小时文本
int radius = (width()-80)/4;//设置半径
QFont font = painter.font();
font.setBold(true);
painter.setFont(font);
int pointSize = font.pointSize();
// 绘制小时文本
int nHour = 0;
for (int i = 0; i < 12; ++i) {
nHour = i + 3;
if (nHour > 12)
nHour -= 12;
painter.drawText(textRectF(radius*0.8, pointSize, i * 30), Qt::AlignCenter, QString::number(nHour));
}
if(1){
sqrt(pow(abs(m_x-width() / 2-width() / 2),2)+pow(abs(m_y-height() / 2-height() / 2),2));
double a=acos(abs(m_x-width() / 2-width() / 2)/sqrt(pow(abs(m_x-width() / 2-width() / 2),2)+pow(abs(m_y-height() / 2-height() / 2),2)));
painter.setPen(QColor(0, 0, 0, 200));
if(a>0.5){
painter.rotate(a*180/3.1415);
}else{
painter.rotate(a*180/3.1415+90);
}
painter.drawLine(92, 0, 96, 0);
painter.rotate(180.0);
painter.drawLine(92, 0, 96, 0);
painter.rotate(180.0);
painter.rotate(360.0-a);
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
m_x=event->x();
m_y=event->y();
update();
}