2022.10.21实训笔记

284 阅读1分钟

绘制

QPainter提供了绘制大多数基本体的函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConverExpolygon()和drawCubicBezier()。drawRects()和drawLines()这两个函数使用当前的画笔在给定的QRects或QLines数组中绘制给定数量的矩形或线条。

QPainer类还提供了fillRect()函数,该函数用给定的QBrush填充给定的QRect,以及擦除给定矩形内区域的eraseRect()函数。

所有这些函数都有整数和浮点版本(推荐使用浮点数版本)。

在父QWidget上绘图 在父QWidget 中重写void paintEvent(QPaintEvent* evnet) 函数 并在函数内创建QPainter对象,传入this指针,表示将在父QWidget上画画

void MainWindow::paintEvent(QPaintEvent* event){
    QPainter painter(this);
    painter.drawLine(QPoint(0,0), QPoint(100,100));
}

在子部件上绘图 在子部件上画图有两种办法:

一、创建部件类的子类,然后重写paintEvent

最简单的方法是在Qt Creator中新增一个Qt 设计师界面类,然后重写 paintEvent,参考代码如下: paintframe.h

#ifndef PAINTFRAME_H
#define PAINTFRAME_H

#include <QFrame>

namespace Ui {
class PaintFrame;
}

class PaintFrame : public QFrame
{
    Q_OBJECT

public:
    explicit PaintFrame(QWidget *parent = nullptr);
    ~PaintFrame();

    void paintEvent(QPaintEvent* event);

private:
    Ui::PaintFrame *ui;
};

#endif // PAINTFRAME_H

paintframe.cpp

#include "paintframe.h"
#include "ui_paintframe.h"
#include "QPainter"

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

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


void PaintFrame::paintEvent(QPaintEvent *event ){
    QPainter painter(this);
    painter.drawLine(QPoint(0,0), QPoint(100,100));
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "QPainter"
#include "QPoint"
#include "QDebug"
#include "paintframe.h"

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

    PaintFrame * frame = new PaintFrame(this);
    frame->move(50, 100);
    frame->resize(200, 200);
    frame->setStyleSheet("PaintFrame{border:1px solid pink}");
    frame->show();
}

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


QImage绘图

//创建一个绘图设备,Format设置为背景透明
    QImage image(400, 300, QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);
 
    //绘图
    p.drawImage(0, 0, QImage("../Image/noya.jpg"));
 
    //像素点操作
    for(int i = 0; i < 50; i++){
        for(int j = 0; j < 50; j++){
            image.setPixel(QPoint(i, j), qRgb(0, 255, 0));
        }
    }
 
    p.end();
 
    image.save("../image.jpg");
}