使用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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买二手房中介毁约怎么办 卖房子买房违约怎么办 买二手房想违约怎么办 劳务合同到期后怎么办 注册完公司后怎么办 社保重复交了怎么办 社保本地重复交怎么办 社保两地重复交怎么办 电脑没有办法重启怎么办 美容院美容师不好管理怎么办 美容院没给收据怎么办 二手车卖了牌照怎么办 二手车没有行驶证怎么办 购买二手车行驶证怎么办 车辆脱审一年怎么办 车辆脱审了怎么办 异地卖车牌照怎么办 车子脱审快一年了怎么办 机动车脱审一年怎么办 小货车脱审怎么办 车辆未过户违章怎么办 车在别人名下怎么办 住廉租房想买车怎么办 汽车过户原车牌怎么办 机动车过户后保险怎么办 车子过不了户怎么办 卖家退款到花呗怎么办 孩子暑假没人带怎么办 被梦创代理骗了怎么办? 忘记密码短信打不开怎么办 qq通话异常结束怎么办 淘宝没有运费险怎么办 qq领取礼包异常怎么办 qq礼包账号异常怎么办 淘宝找不到卖家怎么办 被托管后编制怎么办 买家淘宝违规了怎么办 订单号写错了怎么办 圆通忘记运单号怎么办 阿里巴巴店铺被投诉怎么办 麻辣烫转不出去怎么办