15.Qt Painter

本文介绍如何在Qt中使用自定义Widget并重写绘图事件paintEvent,实现图片的动态显示与移动。通过连接按钮点击信号与槽函数,每次点击更新图片位置,并触发重绘。此外,还展示了如何在paintEvent中使用QPainter绘制各种图形。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

public:
    //绘图事件
    void paintEvent(QPaintEvent *);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>


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

    //点击移动按钮 移动图片

    posX = 10;

    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX += 10;

        //手动调用绘图事件
        update();

    });

}

void Widget::paintEvent(QPaintEvent *)
{
    //创建画家
    QPainter painter(this);

    //如果出屏幕 强制变回10
    if(posX > this->width())
    {
        posX = 10;
    }

    //画图片
    painter.drawPixmap(posX,100,QPixmap(":/Image/OnePiece.png"));


    //高级设置
//    painter.drawEllipse( QPoint(100,100),50,50);
//    //设置抗锯齿 效率低
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse( QPoint(200,100),50,50);


//    painter.drawRect( QRect(20,20,50,50));

//    //移动画家
//    painter.translate(QPoint(100,0));

//    //保存状态
//    painter.save();

//    painter.drawRect( QRect(20,20,50,50));

//    painter.translate(QPoint(100,0));
//    //取出状态
//    painter.restore();

//    painter.drawRect( QRect(20,20,50,50));


//    //设置画笔颜色
//    QPen pen(QColor(255,0,0));
//    //设置笔宽度
//    pen.setWidth(3);
//    //设置笔风格
//    pen.setStyle(Qt::DotLine);
//    //画家用这只笔
//    painter.setPen(pen);

//    //画刷填充颜色
//    QBrush brush(Qt::cyan);
//    //让画家使用画刷
//    brush.setStyle(Qt::Dense4Pattern);
//    painter.setBrush(brush);


//    //利用画家画画
//    //画线
//    painter.drawLine(QPoint(0,0),QPoint(100,100));

//    //画圆(椭圆)
//    painter.drawEllipse(QPoint(100,100),50,50);

//    //画矩形
//    painter.drawRect(QRect(10,10,50,50));

//    //画字体
//    painter.drawText(QRect(10,200,150,50),"好好学习,天天向上");



}

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

 

你提到的 `QWidget.render(...)` 方法签名是 PySide6 中的完整定义,它允许你将一个窗口部件(包括对话框、按钮、标签等)的内容渲染到指定的 `QPainter` 设备上。这个方法非常强大,常用于截图、打印、拖拽预览等场景。 --- ### 方法签名详解 ```python def render(self, painter: PySide6.QtGui.QPainter, targetOffset: PySide6.QtCore.QPoint, sourceRegion: Union[QRegion, QBitmap, QPolygon, QRect] = Default(QRegion), renderFlags: QWidget.RenderFlag = RenderFlags(DrawWindowBackground | DrawChildren)) ``` #### 参数说明: 1. **painter** (`QPainter`) 绘图设备,可以是 `QImage`、`QPixmap`、`QPrinter` 等创建的 `QPainter` 对象。 2. **targetOffset** (`QPoint`) 渲染内容在目标设备上的偏移量。例如 `(10, 10)` 表示从目标设备的 `(10,10)` 位置开始绘制。 3. **sourceRegion** (`Union[QRegion, QBitmap, QPolygon, QRect]`) 要渲染的源区域,默认为整个部件。可以是: - `QRegion`:指定的区域 - `QBitmap`:位图掩码 - `QPolygon`:多边形区域 - `QRect`:矩形区域 4. **renderFlags** (`QWidget.RenderFlag`) 控制渲染行为的标志位,可选值包括: - `DrawWindowBackground`:绘制窗口背景 - `DrawChildren`:绘制所有子控件 - `IgnoreMask`:忽略控件的遮罩 - `DrawAsStaticText`:将内容作为静态文本绘制(优化文本渲染) --- ### 使用示例:将 QWidget 渲染到 QImage ```python from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PySide6.QtGui import QPainter, QImage, QColor from PySide6.QtCore import QPoint, QRect def render_widget_to_image(widget: QWidget, output_path: str): # 创建 QImage 用于绘制 image = QImage(widget.size(), QImage.Format_ARGB32) image.fill(QColor(0, 0, 0, 0)) # 透明背景 # 创建 QPainter painter = QPainter(image) # 渲染部件内容到图像上 widget.render( painter, targetOffset=QPoint(0, 0), # 目标偏移 sourceRegion=QRect(0, 0, widget.width(), widget.height()), # 源区域 renderFlags=widget.RenderFlag.DrawChildren | widget.RenderFlag.DrawWindowBackground ) painter.end() # 保存图像 image.save(output_path) # 示例用法 if __name__ == "__main__": import sys app = QApplication(sys.argv) # 创建一个简单的 QWidget widget = QWidget() widget.setWindowTitle("QWidget 渲染示例") layout = QVBoxLayout() layout.addWidget(QLabel("这是一个用于渲染的 QWidget")) widget.setLayout(layout) widget.resize(400, 200) widget.show() # 渲染并保存图像 render_widget_to_image(widget, "rendered_widget.png") sys.exit(app.exec()) ``` --- ### 常见问题分析 - **参数顺序错误**: 如果你传入的参数顺序不对,例如把 `sourceRegion` 放在 `targetOffset` 之前,会报错类型不匹配。 - **未正确导入 RenderFlags**: `DrawWindowBackground` 和 `DrawChildren` 必须通过 `widget.RenderFlag` 访问。 - **targetOffset 必须是 QPoint**: 不要传入 `QRect` 或 `(x, y)` 元组,必须是 `QPoint(x, y)`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值