采用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();
}
编译顺利通过。亲自写一个好好处是对变量和实现流程都有掌控。欢迎感兴趣的朋友交流。
相关代码资源下载地址: