QT绘画


QT绘画 QPainter

  • 重载 paintEvent

    1. 准备画笔

       QPainter p(this);
      
           p.setPen(QPen(Qt::red, 2, Qt::DashLine));
           p.setBrush(Qt::yellow); //  背景颜色
           p.setFont(QFont("aaa", 40, 700, true)); //italic
    2. 绘制形状

       p.drawLine(QPoint(0,0), QPoint(100,100));
       p.drawRect(QRect(40,60,100,50));
       p.drawText(QPoint(300, 50), "Hellow");
       p.drawPixmap(QPoint(40,40), QPixmap("../aaa.png"));
    3. 图形变换

       {
           QTransform transfrom;       //  可将复杂的功能组合
           transfrom.rotate(30);
           transfrom.scale(.5,.5);     //  缩放
           p.setTransform(transfrom);  //  旋转
       }
      
       p.translate(100,100);   //  变换原点坐标单独
    4. 消除锯齿

       p.setRenderHint(QPainter::Antialiasing);    //  消除锯齿    
    5. *可以先画好图片放入pixmap中,再在窗口绘制

       QPixmap pixmap(size());
       QPainter p(&pixmap);
      
       QTransform transform;
       transform.translate(50,50);
       transform.rotate(30);
       p.setTransform(transform);
      
       p.drawxxx    ... ... 
       P.end();
      
       p.begin(this);
       p.drawPixmap(0,0,pixmap);

示例1(画板实现)


// MyWidget.h 

#include<QVector>
#include <QDebug>
    class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);

    MyButton * button;


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

    QVector<QPoint> _pos;

    QVector< QVector<QPoint> > _lines;

signals:

};


//MyWidget.cpp

void MyWidget::paintEvent(QPaintEvent *event)
{
    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 *event)
{

    if(_lines.size() == 0)
    {
        QVector<QPoint> line;
        _lines.append(line);
    }

    QVector<QPoint>& lastline = _lines.last();
    lastline.append(event->pos());
//    _pos.append(event->pos());
    update();
}

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

//    _pos.append(event->pos());
}

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    QVector<QPoint> line;   //  一条线
    _lines.append(line);     // 一条线放入很多条线 的向量里


    QVector<QPoint>& lastline = _lines.last();
    lastline.append(event->pos());

//    _pos.append(event->pos());
}

示例2 按钮变色


//  MyButton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QMouseEvent>

class MyButton : public QWidget
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);

    MyButton(const QString &text, QWidget* parent = 0);
    QRect _rect;    //  按钮大小
    QString _text;  //  按钮显示文字

    bool _pressed;  //  按压判断

    void paintEvent(QPaintEvent *event);

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


signals:

    void clicked();

};

#endif // MYBUTTON_H


//  MuButton.cpp

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

MyButton::MyButton(QWidget *parent) :
    QWidget(parent), _rect(0,0,100,30)
{
    _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::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    if( _pressed == true )
    {
        p.setBrush(Qt::yellow); //  设置背景为黄色
    }
    else
        p.setBrush(Qt::darkGray);   //  设置背景为灰色
    p.drawRect(_rect);  //  画按钮框
    p.drawText(_rect, _text, QTextOption(Qt::AlignCenter)); //  画文字
}

void MyButton::mousePressEvent(QMouseEvent *event)
{
    //  按下时 按钮状态为 true 更新颜色
    _pressed = true;
    update();
}

void MyButton::mouseReleaseEvent(QMouseEvent *event)
{
    //  释放时 按钮状态为 false 更新颜色
    _pressed = false;
    update();

    //  在设定框框的容器范围内才发送信号
    if(_rect.contains(event->pos()))
    {
    emit clicked();
    }
//    emit clicked();
}


文章作者: bySouffle
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 bySouffle !
  目录