QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)

本文将分为两部分
1.获取LineEdit的内容,并通过该内容绘制图形。
2.使用QPainterPath来绘制重复的路径

一、获取LineEdit的内容绘制
1.新建工程

基类类型选择为QWidget
进入ui界面拖入四个label,四个LineEdit,一个pushButton
(各控件的名字如第二张图片)
在按钮出右键->转到槽->clicked()转到槽函数的定义处。

QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)_第1张图片
QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)_第2张图片
2.修改.h文件

引入头文件QPaintEvent和QPainter
引入虚函数void paintEvent(QPaintEvent *);
定义绘制时所需的参数x,y,w,h和flag(绘制的标志参数)。

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    int w=100,h=100;
    int x=20,y=20;
    int flag=0;

protected:
    void paintEvent(QPaintEvent *);
private slots:
    void on_pushButton_clicked();
};

#endif // WIDGET_H

3.修改widget.cpp函数

使用 toInt() 将字符串类型的数据转化为整型。
设定flag为1才进行绘制保证绘制界面开始为空白的。
QWidget::update(); 保证每次按下按钮后都会刷新一次界面。
(刷新界面很重要,如果不刷新的话,需要将界面缩小再放大才能看到绘制的变化,
如果基类为QMainWindow的话刷新函数为QMainWindow::update()

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{    
    QPainter painter(this);
    if(flag==1)
    {        
        painter.drawRect(x,y,w,h);
    }   
    flag=0;
}



void Widget::on_pushButton_clicked()
{
    x=(ui->lineEdit_x->text()).toInt();
    y=(ui->lineEdit_y->text()).toInt();
    w=(ui->lineEdit_w->text()).toInt();
    h=(ui->lineEdit_h->text()).toInt();
    flag=1;
    QWidget::update();
}

进入界面后输入参数并按下绘制按钮

效果如下:
QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)_第3张图片

二.使用QPainterPath来绘制重复的路径

1.修改ui界面
在ui界面中拖入一个按钮,改文本为复制
QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)_第4张图片
2.修改widget.cpp文件

使用QPainterPath来进行绘制,其好处是可以把一个复杂的图形绘制QPainterPath中,而后可以新建另一个QPainterPath变量来继承复制图形的绘制过程。这样就可以使代码更简洁。
通过flag的值可以让绘制的时机更加的得心应手。

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPainterPath path;
    QPainterPath path2;
    path.addRect(x,y,w,h);
    if(flag==1)
    {
        painter.drawPath(path);
    }

    else if(flag==2)
    {
        painter.drawPath(path);
        path2.addPath(path);
        path2.translate(200,0);//2相对于1改变的坐标
        painter.drawPath(path2);
    }
    flag=0;
}



void Widget::on_pushButton_clicked()
{
    x=(ui->lineEdit_x->text()).toInt();
    y=(ui->lineEdit_y->text()).toInt();
    w=(ui->lineEdit_w->text()).toInt();
    h=(ui->lineEdit_h->text()).toInt();
    flag=1;
    QWidget::update();
}

void Widget::on_pushButton_2_clicked()
{
    flag=2;
    QWidget::update();
}

输入参数后按下绘制和上一个代码效果相同,
按下复制后在右侧又新出现一个相同的图形。

效果如下:
QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8)_第5张图片

本文到此结束,下一篇为如何获得带有滚动条界面内的坐标,学习如何获得滚动条划过的长度。

你可能感兴趣的:(QT根据参数绘制图形+重复绘制路径的简单方法(QT系列8))