QT基础(三)----QPainter画图功能 & 画图小项目

一 QPainter基础功能介绍


头文件mywidget.h


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPainter>

class Mywidget : public QWidget
{
    Q_OBJECT
public:
    explicit Mywidget(QWidget *parent = 0);

    void paintEvent(QPaintEvent *e);

signals:

public slots:
};

#endif // MYWIDGET_H


源文件:


#include "mywidget.h"
#include<QApplication>
#include<QPixmap>

Mywidget::Mywidget(QWidget *parent) : QWidget(parent)
{

}

void Mywidget::paintEvent(QPaintEvent *e)
{
    QPixmap pixmap(size()); //相当于小汽车,将所画的东西打包塞进小汽车中

    //paintEvent需要画笔工具QPainter,在头文件QPainter中
    QPainter p(&pixmap);    //画在小汽车里边,能有效提高效率


    QTransform transform;
    //transform可以代替p的translate,因为他会进行一系列复杂的运算,平移、旋转、缩放等等
    //虽然p也有scale,rotate,translate等函数
    transform.rotate(10);
    transform.scale(0.8, 0.8);  //缩放功能
    //将以下所有的图像旋转10度,改语句后面的所画的图像都要旋转
    p.setTransform(transform);
    //将下方画的所有图形移动相对应的位置,整体图像平移,只影响这句话之后的语句,知道遇到下一个translate语句
    p.translate(100, 100);
    //消锯齿,让画出的图形更加美观
    p.setRenderHint(QPainter::SmoothPixmapTransform);
    //设置画笔属性
    p.setPen(QPen(Qt::red, 2, Qt::DashDotLine));
    //设置封闭图像的填充颜色,从BrushStyle文件中找,要学会查询函数的使用准则
    p.setBrush(Qt::CrossPattern);
    //设置字体格式,宋体, 40个像素, 加粗值为100, 斜体
    p.setFont(QFont("宋体", 40, 100, true));

    QTransform transform2;
    transform.scale(0.5, 0.5);
    //这里的false代表是和前面的transform相互独立,效果不叠加
    p.setTransform(transform2, false);


    //画一条直线
    p.drawLine(QPoint(0, 0), QPoint(100, 100));
    //画一个椭圆,第一个参数为中心点,第二个第三个分别为x和y的轴长,当二者相等时未圆
    p.drawEllipse(QPoint(100, 100), 50, 50);
    //画字
    p.drawText(QPoint(200, 100), "Hello, China!");
    //画图
    p.drawPixmap(QPoint(230, 300), QPixmap("pic.jpg"));
    //画出直角矩形
    p.drawRect(QRect(150, 150, 100,60));
    //画出有弧的矩形
    p.drawRoundedRect(QRect(230, 230, 100,60), 20, 20);

    //结束画笔
    p.end();

    //开始在窗口上画,画什么呢?
    p.begin(this);
    //前方开始装车的过程,最后一股气打包全部带走,送到窗口
    //北京颜色发生了改变,怎么变回来呢?
    p.drawPixmap(QPoint(0, 0), pixmap);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Mywidget w;
    w.show();

    app.exec();
}

运行结果:

QT基础(三)----QPainter画图功能 & 画图小项目_第1张图片

注意:提高画图的效率!

二 画板小项目


头文件Mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include<QWidget>
#include<QPainter>
#include<QMouseEvent>

class Mywidget : public QWidget
{
    Q_OBJECT
public:
    explicit Mywidget(QWidget *parent = 0);

    void paintEvent(QPaintEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

    QVector<QVector<QPoint>> _lines;  //画多条线
signals:

public slots:
};

#endif // MYWIDGET_H

源文件:

#include "mywidget.h"
#include<QApplication>

Mywidget::Mywidget(QWidget *parent) : QWidget(parent)
{

}

void Mywidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    for(int i=0; i<_lines.size(); i++)
    {
        const QVector<QPoint> &line = _lines.at(i);
        for(int j=0; j<line.size()-1; j++)
            p.drawLine(line.at(j), line.at(j+1));
    }
}

void Mywidget::mouseMoveEvent(QMouseEvent *ev)
{
    if(_lines.size() == 0)
    {
        QVector<QPoint> line;
        _lines.append(line);
    }

    QVector<QPoint> &lastLine = _lines.last();
    //记录该条线当前的位置
    lastLine.append(ev->pos());
    //强制重绘
    update();
}

void Mywidget::mousePressEvent(QMouseEvent *ev)
{
    //每次点击鼠标都会为之绘画一条新的线,并将该线的起点位置添加到_lines中
    QVector<QPoint> line;
    _lines.append(line);

    //记录下该条线当前的位置
    QVector<QPoint> &lastLine = _lines.last();
    lastLine.append(ev->pos());
}

void Mywidget::mouseReleaseEvent(QMouseEvent *ev)
{
    QVector<QPoint> &lastLine = _lines.last();
    lastLine.append(ev->pos());
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Mywidget w;
    w.show();

   return app.exec();
}

运行结果:


注意:
  • 需要在鼠标移动的时候调用update(),使之强制重绘,否则,画面版上不会出现任何效果。
  • QVector函数的使用方法和CPP中的Vector方法差不多。

三 在该项目的基础上增加一个按钮


新增一个类MyButton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>

class MyButton : public QWidget
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = 0);
    MyButton(const QString& text, QWidget* parent = 0);

    QRect _rect;
    QString _text;
    bool _pressed;
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);

    void paintEvent(QPaintEvent *);

signals:
    void clicked();

public slots:

};

#endif // MYBUTTON_H

源文件MyButton.cpp

#include "MyButton.h"
#include <QPainter>
#include <QMouseEvent>
MyButton::MyButton(QWidget *parent) :
    QWidget(parent), _rect(0, 0, 100, 30), _text(QString())
{
    _pressed = false;
    this->setGeometry(_rect);
}

MyButton::MyButton(const QString &text, QWidget *parent):
    QWidget(parent), _text(text), _rect(0, 0, 100, 30)
{
    _pressed = false;
    this->setGeometry(_rect);
}

void MyButton::mousePressEvent(QMouseEvent *)
{
    _pressed = true;
    update();
}

void MyButton::mouseReleaseEvent(QMouseEvent *ev)
{
    _pressed = false;
    update();

    if(_rect.contains(ev->pos()))
        emit clicked();
    // callback handler
}
void MyButton::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    if(_pressed)
        p.setBrush(Qt::yellow);
    else
        p.setBrush(Qt::darkGray);
    p.drawRect(_rect);
    p.drawText(_rect, _text, QTextOption(Qt::AlignCenter));
}

MyWidget,h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "MyButton.h"

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    MyButton* button;

    void paintEvent(QPaintEvent *);

    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);

    QVector< QVector<QPoint> > _lines;

signals:

public slots:
    void slotButtonClicked();
};

#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
#include <QDebug>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    button = new MyButton("MyButton", this);
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));

//    button->setGeometry(30, 30, 100, 30);
}

void MyWidget::slotButtonClicked()
{
    qDebug() << "button is clicked";
}

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    for(int i=0; i<_lines.size(); ++i)
    {
        const QVector<QPoint>& line = _lines.at(i);
        for(int j=0; j<line.size()-1; ++j)
        {
            p.drawLine(line.at(j), line.at(j+1));
        }
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent *ev)
{
    if(_lines.size() == 0)
    {
        QVector<QPoint> line;
        _lines.append(line);
    }

    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());

    update();
}
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
    QVector<QPoint> line;
    _lines.append(line);

    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}
void MyWidget::mouseReleaseEvent(QMouseEvent *ev)
{
    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}

#include <QApplication>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    return app.exec();
}

功能:新加了一个按钮

你可能感兴趣的:(qt,画图,重绘,QPaint)