QT焦度计核心绘图



 
#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();
}
 

猜你喜欢

转载自blog.csdn.net/cqltbe131421/article/details/73527046