Qt 4 手撕Plot平面绘图控件V1.0版

采用QT4自定义类,实现WIDGET空间的提升,并用QPAINTER来实现绘图操作。

常见的是采用QWT和QCustomPlot,但这两个感觉还是有点麻烦,不如自己亲自手撕一个。

先看看效果:打开以后处于默认状态:

通过设置line edit里的参数,可以实现绘图区域的坐标转换,同时实现线段的绘制。

直接上代码:

#ifndef GPPLOT_H
#define GPPLOT_H

#include <QWidget>


// 平面绘图 继承自QWIDGET类
class gpplot : public QWidget
{
    Q_OBJECT
public:
    explicit gpplot(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);
    bool showLineFlag;
    double xmin,xlen,ymin,ylen;
    double x0,y0,x1,y1;
};

#endif // GPPLOT_H

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
//    void resizeEvent(QResizeEvent *);

private slots:
    void on_pushButtonShowLine_clicked();
    void on_pushButtonHideLine_clicked();
    void on_pushButtonResetRange_clicked();
    void on_lineEditXmin_editingFinished();
    void on_lineEditXlen_editingFinished();
    void on_lineEditYmin_editingFinished();
    void on_lineEditYlen_editingFinished();
    void on_lineEditX0_editingFinished();
    void on_lineEditY0_editingFinished();
    void on_lineEditX1_editingFinished();
    void on_lineEditY1_editingFinished();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

#include "gpplot.h"
#include <QDebug>

#include <QPainter>

gpplot::gpplot(QWidget *parent) :
    QWidget(parent)
{
    xmin = 0;
    xlen = 1;
    ymin = 0;
    ylen = 1;
    x0 = 0;
    y0 = 0;
    x1 = 1;
    y1 = 1;
    showLineFlag = false;
}

void gpplot::paintEvent(QPaintEvent *event)
{
    QPainter pt(this);

    // 绘制边框和标签
    int height = this->geometry().height();
    int width = this->geometry().width();
    QRect rectBorder = QRect(0,0,width-1,height-1);
    QRect rectLabel = QRect(3,3,width-5,height-5);
    QRect rectfill = QRect(1,1,width-3,height-3);
    pt.drawRect(rectBorder);
    pt.fillRect(rectfill,Qt::white);
    pt.drawText(rectLabel,Qt::AlignLeft|Qt::AlignBottom,QString::number(xmin)+tr(",")+QString::number(ymin));
    pt.drawText(rectLabel,Qt::AlignTop|Qt::AlignLeft,QString::number(ymin+ylen));
    pt.drawText(rectLabel,Qt::AlignBottom|Qt::AlignRight,QString::number(xmin+xlen));

    // 代入新坐标范围
    pt.setWindow(QRect(xmin,ymin,xlen,ylen));

    // 绘制线段
    if(showLineFlag == true)
        pt.drawLine(QPoint(x0,ymin+ylen-y0),QPoint(x1,ymin+ylen-y1));
    update();
}

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "gpplot.h"
#include <QDebug>
#include <QPainter>

// 构造函数
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setMinimumHeight(500);

    // 控件初始化
    ui->lineEditXmin->setText(tr("0"));
    ui->lineEditXlen->setText(tr("1"));
    ui->lineEditYmin->setText(tr("0"));
    ui->lineEditYlen->setText(tr("1"));
    ui->lineEditX0->setText(tr("0"));
    ui->lineEditY0->setText(tr("0"));
    ui->lineEditX1->setText(tr("1"));
    ui->lineEditY1->setText(tr("1"));

    // gp成员变量初始化
    ui->gp->xmin = ui->lineEditXmin->text().toDouble();
    ui->gp->ymin = ui->lineEditYmin->text().toDouble();
    ui->gp->xlen = ui->lineEditXlen->text().toDouble();
    ui->gp->ylen = ui->lineEditYlen->text().toDouble();
    ui->gp->x0 = ui->lineEditX0->text().toDouble();
    ui->gp->y0 = ui->lineEditY0->text().toDouble();
    ui->gp->x1 = ui->lineEditX1->text().toDouble();
    ui->gp->y1 = ui->lineEditY1->text().toDouble();
}

// 析构函数
MainWindow::~MainWindow()
{
    delete ui;
}

// 重设范围 按钮
void MainWindow::on_pushButtonResetRange_clicked()
{
    // 控件初始化
    ui->lineEditXmin->setText(tr("0"));
    ui->lineEditXlen->setText(tr("1"));
    ui->lineEditYmin->setText(tr("0"));
    ui->lineEditYlen->setText(tr("1"));
    ui->lineEditX0->setText(tr("0"));
    ui->lineEditY0->setText(tr("0"));
    ui->lineEditX1->setText(tr("1"));
    ui->lineEditY1->setText(tr("1"));

    // gp成员变量初始化
    ui->gp->xmin = ui->lineEditXmin->text().toDouble();
    ui->gp->ymin = ui->lineEditYmin->text().toDouble();
    ui->gp->xlen = ui->lineEditXlen->text().toDouble();
    ui->gp->ylen = ui->lineEditYlen->text().toDouble();
    ui->gp->x0 = ui->lineEditX0->text().toDouble();
    ui->gp->y0 = ui->lineEditY0->text().toDouble();
    ui->gp->x1 = ui->lineEditX1->text().toDouble();
    ui->gp->y1 = ui->lineEditY1->text().toDouble();

    // 不显示线段
    ui->gp->showLineFlag = false;
}

// 显示线段 按钮
void MainWindow::on_pushButtonShowLine_clicked()
{
    ui->gp->showLineFlag = true;
}

// 隐藏线段 按钮
void MainWindow::on_pushButtonHideLine_clicked()
{
    ui->gp->showLineFlag = false;
}

// 编辑输入框回调函数
void MainWindow::on_lineEditXmin_editingFinished()
{
    ui->gp->xmin = ui->lineEditXmin->text().toDouble();
}

void MainWindow::on_lineEditXlen_editingFinished()
{
    ui->gp->xlen = ui->lineEditXlen->text().toDouble();
}

void MainWindow::on_lineEditYmin_editingFinished()
{
    ui->gp->ymin = ui->lineEditYmin->text().toDouble();
}

void MainWindow::on_lineEditYlen_editingFinished()
{
    ui->gp->ylen = ui->lineEditYlen->text().toDouble();
}

// 编辑输入框回调函数
void MainWindow::on_lineEditX0_editingFinished()
{
    ui->gp->x0 = ui->lineEditX0->text().toDouble();
}

void MainWindow::on_lineEditY0_editingFinished()
{
    ui->gp->y0 = ui->lineEditY0->text().toDouble();
}

void MainWindow::on_lineEditX1_editingFinished()
{
    ui->gp->x1 = ui->lineEditX1->text().toDouble();
}

void MainWindow::on_lineEditY1_editingFinished()
{
    ui->gp->y1 = ui->lineEditY1->text().toDouble();
}

编译顺利通过。亲自写一个好好处是对变量和实现流程都有掌控。欢迎感兴趣的朋友交流。

相关代码资源下载地址:

QT4自编Plotter绘图控件实现坐标转换及线段绘制-金融文档类资源-CSDN下载QT4自编Plotter绘图控件实现坐标转换及线段绘制更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/zjjsd195/77977793

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Intimes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值