头文件:  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的空白图片作为母版,画出直方图保存到本地。

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐