本文将分为两部分
1.获取LineEdit的内容,并通过该内容绘制图形。
2.使用QPainterPath来绘制重复的路径
一、获取LineEdit的内容绘制
1.新建工程
基类类型选择为QWidget
进入ui界面拖入四个label,四个LineEdit,一个pushButton
(各控件的名字如第二张图片)
在按钮出右键->转到槽->clicked()转到槽函数的定义处。
2.修改.h文件
引入头文件QPaintEvent和QPainter
引入虚函数void paintEvent(QPaintEvent *);
定义绘制时所需的参数x,y,w,h和flag(绘制的标志参数)。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
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();
}
进入界面后输入参数并按下绘制按钮
效果如下:
二.使用QPainterPath来绘制重复的路径
1.修改ui界面
在ui界面中拖入一个按钮,改文本为复制
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();
}
输入参数后按下绘制和上一个代码效果相同,
按下复制后在右侧又新出现一个相同的图形。
效果如下:
本文到此结束,下一篇为如何获得带有滚动条界面内的坐标,学习如何获得滚动条划过的长度。