头文件: qt_paint_char.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_qt_paint_char.h"
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
namespace Ui {
class MainWindow;
}
class qt_paint_char : public QMainWindow
{
Q_OBJECT
public:
qt_paint_char(QWidget *parent = Q_NULLPTR);
~qt_paint_char();
void calc();
//void paintEvent(QPaintEvent *event);
void paintEvent();
private:
Ui::qt_paint_charClass ui;
/*int P1A[10] = { 0 }, P1B[10] = { 0 };*/
std::vector<std::vector<float>> PA;
std::vector<std::vector<float>> PB;
QList<float> listA, listB;
};
#endif // MAINWINDOW_H
qt_paint_char.cpp
#include "qt_paint_char.h"
#include <QPainter>
#include <windows.h>
#pragma execution_character_set("utf-8");
qt_paint_char::qt_paint_char(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
calc();
paintEvent();
}
qt_paint_char::~qt_paint_char()
{
//delete ui;
}
void qt_paint_char::calc()
{
srand(GetTickCount());
for (int i=0;i<100;i++)
{
float random_1 = rand() % 100; //eg:100以内的数
random_1 /= 100;
listA.append(random_1);
}
for (int i = 0; i < 100; i++)
{
float random_2 = rand() % 100; //eg:100以内的数
random_2 /= 100;
listB.append(random_2);
}
QListIterator<float> i(listA);
QListIterator<float> j(listB);
PA.resize(20);
PB.resize(20);
for (; i.hasNext();)
{
float num = i.next();
if (num >= 0 && num < 0.05) PA[0].push_back(num);
if (num >= 0.05 && num < 0.1) PA[1].push_back(num);
if (num >= 0.1 && num < 0.15) PA[2].push_back(num);
if (num >= 0.15 && num < 0.2) PA[3].push_back(num);
if (num >= 0.2 && num < 0.25) PA[4].push_back(num);
if (num >= 0.25 && num < 0.3) PA[5].push_back(num);
if (num >= 0.3 && num < 0.35) PA[6].push_back(num);
if (num >= 0.35 && num < 0.4) PA[7].push_back(num);
if (num >= 0.4 && num < 0.45) PA[8].push_back(num);
if (num >= 0.45 && num < 0.5) PA[9].push_back(num);
if (num >= 0.5 && num < 0.55) PA[10].push_back(num);
if (num >= 0.55 && num < 0.6) PA[11].push_back(num);
if (num >= 0.6 && num < 0.65) PA[12].push_back(num);
if (num >= 0.65 && num < 0.7) PA[13].push_back(num);
if (num >= 0.7 && num < 0.75) PA[14].push_back(num);
if (num >= 0.75 && num < 0.8) PA[15].push_back(num);
if (num >= 0.8 && num < 0.85) PA[16].push_back(num);
if (num >= 0.85 && num < 0.9) PA[17].push_back(num);
if (num >= 0.9 && num < 0.95) PA[18].push_back(num);
if (num >= 0.95 && num <= 1) PA[19].push_back(num);
}
for (; j.hasNext();)
{
float num = j.next();
if (num >= 0 && num < 0.05) PB[0].push_back(num);
if (num >= 0.05 && num < 0.1) PB[1].push_back(num);
if (num >= 0.1 && num < 0.15) PB[2].push_back(num);
if (num >= 0.15 && num < 0.2) PB[3].push_back(num);
if (num >= 0.2 && num < 0.25) PB[4].push_back(num);
if (num >= 0.25 && num < 0.3) PB[5].push_back(num);
if (num >= 0.3 && num < 0.35) PB[6].push_back(num);
if (num >= 0.35 && num < 0.4) PB[7].push_back(num);
if (num >= 0.4 && num < 0.45) PB[8].push_back(num);
if (num >= 0.45 && num < 0.5) PB[9].push_back(num);
if (num >= 0.5 && num < 0.55) PB[10].push_back(num);
if (num >= 0.55 && num < 0.6) PB[11].push_back(num);
if (num >= 0.6 && num < 0.65) PB[12].push_back(num);
if (num >= 0.65 && num < 0.7) PB[13].push_back(num);
if (num >= 0.7 && num < 0.75) PB[14].push_back(num);
if (num >= 0.75 && num < 0.8) PB[15].push_back(num);
if (num >= 0.8 && num < 0.85) PB[16].push_back(num);
if (num >= 0.85 && num < 0.9) PB[17].push_back(num);
if (num >= 0.9 && num < 0.95) PB[18].push_back(num);
if (num >= 0.95 && num <= 1) PB[19].push_back(num);
}
}
void qt_paint_char::paintEvent()
{
//Q_UNUSED(event);
QPixmap pixmap("F:\\000\\test_gray\\123.png");
QPainter painter(&pixmap);
painter.setPen(QColor(0, 0, 0));
QFont font;
//绘制直方图 远点50,400,单位高度50 单位宽度20
painter.drawLine(100, 800, 800, 800); //x轴 单位长10,30个单位,总长350
painter.drawLine(100, 800, 100, 100); //y轴 单位50,5个单位,总长300
painter.drawLine(100, 100, 90, 110); //上箭头
painter.drawLine(100, 100, 110, 110); //上箭头
painter.drawLine(790, 790, 800, 800); //右箭头
painter.drawLine(790, 810, 800, 800); //右箭头
int xi = 10; //单位长度x
int yi = 60; //单位长度y
int u = 4; //刻度的长度
//画y轴的刻度
for (int i = 1; i <= 10; i++)
{
font.setPointSize(10);
painter.setFont(font);
painter.drawLine(100, 800 - yi * i, 100 + u, 800 - yi * i); //画刻度线
if (i==10) painter.drawText(QPoint(82, 805 - yi * i), QString::number(i*0.1)); //画刻度数字
else painter.drawText(QPoint(75, 805 - yi * i), QString::number(i*0.1)); //画刻度数字
}
//画x轴的刻度
for (int i = 0; i < 20; i++)
{
painter.drawLine(100+40 + xi * 3 * i, 800, 100 + 40 + xi * 3 * i, 805); //画刻度线
font.setPointSize(15);
painter.setFont(font);
QString rotateText = QString::number(0.05 + 0.05*i);
painter.translate(100 + 30 + xi * 3 * i, 815); // 第1步:变换旋转中心到所绘制文字左下角
painter.rotate(60); // 第2步: 旋转一定角度
painter.drawText(0, 0, rotateText); // 第3步: 绘制文字
painter.resetMatrix(); // 第4步: 恢复坐标旋转
//painter.drawText(QPoint(100 + 30 + xi * 3 * i, 825), QString::number(0.05 + 0.05*i)); //画刻度数字
}
painter.setBrush(QColor(255, 30, 30));
for (int i = 0; i < 20; i++)
{
int Ax = 100 + 30 + i * 30;
int Ay = 800 - int(700 * (float(PA[i].size()) / float(listA.size())));
int Aw = 10;
int Ah = int(700 * (float(PA[i].size()) / float(listA.size())));
painter.drawRect(Ax, Ay, Aw, Ah);
font.setPointSize(12);
painter.setFont(font);
QString rotateText = QString::number(PA[i].size());
painter.translate(Ax, Ay - 27); // 第1步:变换旋转中心到所绘制文字左下角
painter.rotate(90); // 第2步: 旋转一定角度
painter.drawText(0, 0, rotateText); // 第3步: 绘制文字
painter.resetMatrix(); // 第4步: 恢复坐标旋转
//painter.drawText(QPoint(Ax, Ay-5) ,QString::number(PA[i].size()));
}
painter.setBrush(QColor(30, 255, 30));
for (int i = 0; i < 20; i++)
{
int Bx = 100 + 40 + i * 30;
int By = 800 - int(700 * (float(PB[i].size()) / float(listB.size())));
int Bw = 10;
int Bh = int(700 * (float(PB[i].size()) / float(listB.size())));
painter.drawRect(Bx, By, Bw, Bh);
font.setPointSize(12);
painter.setFont(font);
QString rotateText = QString::number(PB[i].size());
painter.translate(Bx, By - 33); // 第1步:变换旋转中心到所绘制文字左下角
painter.rotate(90); // 第2步: 旋转一定角度
painter.drawText(0, 0, rotateText); // 第3步: 绘制文字
painter.resetMatrix(); // 第4步: 恢复坐标旋转
//painter.drawText(QPoint(Bx, By - 4), QString::number(PB[i].size()));
}
//给出说明
font.setPointSize(20);
painter.setFont(font);
painter.drawText(QPoint(730, 830), "得分区间");
painter.drawText(QPoint(60, 100), "数");
painter.drawText(QPoint(60, 125), "据");
painter.drawText(QPoint(60, 150), "比");
painter.drawText(QPoint(60, 175), "例");
painter.setBrush(QColor(255, 30, 30));
painter.drawRect(200, 100, 30, 30);
painter.drawText(QPoint(245, 119), "OK/0");
painter.setBrush(QColor(30, 255, 30));
painter.drawRect(200, 150, 30, 30);
painter.drawText(QPoint(245, 169), "NG/1");
pixmap.save("F:\\000\\test_ZReulstReulst\\456.png","png");
listA.clear();
listB.clear();
PA.clear();
PB.clear();
}
main.cpp
#include "qt_paint_char.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qt_paint_char w;
w.show();
return a.exec();
}
这里面不需要设置ui参数和界面文件,因为图片是保存到本地,需要拿一张900x900的空白图片作为母版,画出直方图保存到本地。