使用Qt画出直方图和分位数图
来源:互联网 发布:万网域名交易平台 编辑:程序博客网 时间:2024/05/19 13:08
来源:物联网智能信息处理课程的一个小作业
使用工具:Qt5.8
平台:Mac os 10.11
要求:
一些说明:
1.Qt的窗口绘制函数为
void paintEvent(QPaintEvent *event);
需要从父类继承,然后自己实现,我们的有关绘图的操作就在这里实现。
2.Qt的绘图函数我们使用到的绘图相关函数主要为QPainter,QColor等,QBrush等,用法比较初级。
3.本程序的重点在于在坐标的变换,在写程序之前,一定会要画好早图,只有明白了坐标的变换规则,才能顺利的完成自己的程序。
4.一般的窗口的坐标原点都是客户区左上角,向右为X轴正方向,向下为Y轴正方向。
结果展示:
工程的结构:
项目代码:
IIPDraw2.pro
#-------------------------------------------------## Project created by QtCreator 2017-05-14T14:54:02##-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = IIPDraw2TEMPLATE = app# The following define makes your compiler emit warnings if you use# any feature of Qt which as been marked as deprecated (the exact warnings# depend on your compiler). Please consult the documentation of the# deprecated API in order to know how to port your code away from it.DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.# In order to do so, uncomment the following line.# You can also select to disable deprecated APIs only up to a certain version of Qt.#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += main.cpp\ mainwindow.cppHEADERS += mainwindow.hFORMS += mainwindow.ui
mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void calc(); void paintEvent(QPaintEvent *event);private: Ui::MainWindow *ui; int P1A[10]={0},P1B[10]={0}; QList<int> listA,listB;};#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();}
main window.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QPainter>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); calc();}MainWindow::~MainWindow(){ delete ui;}void MainWindow::calc(){ listA<<19<<18<<18<<15<<18 <<11<<16<<19<<17<<17 <<20<<17<<19<<20<<20 <<15<<15<<16; listB<<19<<15<<20<<20<<17 <<18<<18<<15<<16<<18 <<15<<19<<20<<19<<19 <<16<<17<<13<<15; QListIterator<int> i(listA); QListIterator<int> j(listB); for(;i.hasNext();) { int num = i.next(); P1A[num-10-1]++; } for(;j.hasNext();) { int num = j.next(); P1B[num-10-1]++; }}void MainWindow::paintEvent(QPaintEvent *event){ Q_UNUSED(event); QPainter painter(this); painter.setPen(QColor(0,0,0)); //绘制直方图 远点50,400,单位高度50 单位宽度20 painter.drawLine(50,400,360,400); //x轴 单位长10,30个单位,总长350 painter.drawLine(50,400,50,100); //y轴 单位50,5个单位,总长300 painter.drawLine(50,100,45,105); //上箭头 painter.drawLine(50,100,55,105); //上箭头 painter.drawLine(355,395,360,400); //右箭头 painter.drawLine(355,405,360,400); //右箭头 int xi = 10; //单位长度x int yi = 50; //单位长度y int u = 3; //刻度的长度 //画y轴的刻度 for(int i=0;i<=5;i++) { painter.drawLine(50,400-yi*i,50+u,400-yi*i); //画刻度线 painter.drawText(QPoint(40,403-yi*i),QString::number(i)); //画刻度数字 } //画x轴的刻度 for(int i=11;i<=20;i++) { painter.drawLine(40+xi*3*(i-10),400,40+xi*3*(i-10),403); //画刻度线 painter.drawText(QPoint(35+xi*3*(i-10),420),QString::number(i-10)); //画刻度数字 } painter.setBrush(QColor(62,147,192)); for(int i=11;i<=20;i++) { painter.drawRect(60+(i-10-1)*30,400-50*P1A[i-10-1],10,50*P1A[i-10-1]); } painter.setBrush(QColor(62,102,149)); for(int i=11;i<=20;i++) { painter.drawRect(70+(i-10-1)*30,400-50*P1B[i-10-1],10,50*P1B[i-10-1]); } //绘制分位数图 远点500,400,单位高度50 单位宽度20 painter.drawLine(500,400,950,400); //x轴 单位长100,4个单位,总长450 painter.drawLine(500,400,500,70); //y轴 单位30,10个单位,总长330 painter.drawLine(500,70,495,75); //上箭头 painter.drawLine(500,70,505,75); //上箭头 painter.drawLine(945,395,950,400); //右箭头 painter.drawLine(945,405,950,400); //右箭头 int xj = 100; //单位长度x int yj = 30; //单位长度y int v = 3; //刻度的长度 //画y轴的刻度 for(int i=11;i<=20;i++) { painter.drawLine(500,400-yj*(i-10),500+v,400-yj*(i-10)); //画刻度线 painter.drawText(QPoint(480,403-yj*(i-10)),QString::number(i)); //画刻度数字 } //画x轴的刻度 for(int i=0;i<=4;i++) { painter.drawLine(500+xj*i,400,500+xj*i,397); //画刻度线 painter.drawText(QPoint(490+xj*i,420),QString::number(i/4.0)); //画刻度数字 } //画出分为图点的位置 //x的位置为:(float)num/listA.length()*400+500 y的位置为:400-(i+1)*30 int num=1; //内层循环计数 painter.setBrush(QColor(62,147,192)); for(int i=0;i<10;i++) { for(int j=1;j<=P1A[i];j++) { painter.drawEllipse((float)num/listA.length()*400+500,400-(i+1)*30,8,8); num++; } } num = 1; painter.setBrush(QColor(62,102,149)); for(int i=0;i<10;i++) { for(int j=1;j<=P1B[i];j++) { painter.drawEllipse((float)num/listB.length()*400+500,400-(i+1)*30,8,8); num++; } } //给出说明 painter.drawText(QPoint(360,520),"说明:"); painter.drawText(QPoint(450,520),"A班"); painter.drawText(QPoint(450,570),"B班"); painter.setBrush(QColor(62,147,192)); painter.drawRect(400,500,30,30); painter.setBrush(QColor(62,102,149)); painter.drawRect(400,550,30,30); //标题 QFont font; font.setFamily("Microsoft YaHei"); font.setPointSize(50); font.setItalic(true); painter.setFont(font); painter.drawText(rect(), Qt::AlignHCenter, "A班和B班的直方图和分位数图");}
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>1000</width> <height>700</height> </rect> </property> <property name="minimumSize"> <size> <width>1000</width> <height>700</height> </size> </property> <property name="maximumSize"> <size> <width>1000</width> <height>700</height> </size> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"/> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>1000</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/></ui>
本程序只是QT图形绘制的最简单最基础的应用,如有哪些写的不好的地方,忘各位批评指正。
0 0
- 使用Qt画出直方图和分位数图
- QT绘图应用2:利用Qt绘制直方图和分位数图
- 【数据挖掘】:分位数-分位数图
- 使用openCV画出一幅图像的直方图
- 使用openCV画出一幅图像的直方图
- 在Shape Context中画出直方图和极坐标图
- 分位数
- 【canvas】使用canvas画出坐标和线
- 四分位数(Quartiles)、十分位数(Deciles)和百分位数(Percentiles
- python—networkx:求图的平均路径长度并画出直方图
- 为什么在直方图画布上画出直方图用了减法
- OpenCV学习(十六)之直方图均衡化并画出直方图
- 如何使用Core Plot绘制直方图和折线图
- 如何使用Core Plot绘制直方图和折线图
- 如何使用Core Plot绘制直方图和折线图
- 分位数和分位线(Quantiles and Percentiles)
- 直方图类的建立和使用 灰度直方图和彩色直方图
- 关于k分位数
- Fragment
- 简析ASP.NET WebApi的跨域签名
- css总结
- 在maven下搭建SSM开发框架
- SuperAgent使用简介
- 使用Qt画出直方图和分位数图
- 杭电ACM2026:首字母大写
- 自学Swift3.0
- Hive的基本操作
- Android uses-permission 总结
- Amplify Shader Editor入门教程
- Seajs入门,5分钟学会Seajs。
- 神族文字
- Android 开发之Service 探索如何保证Service不被杀死或被kill之后自动重启