QT QPainter事件

本文介绍了Qt中的QPainter类用于图形绘制,包括画线、圆、矩形和文字。QPaintDevice如QPixmap和QImage提供了绘图表面。讨论了抗锯齿设置、画家移动、状态保存与恢复,以及如何利用QTimer动态更新界面。同时提到了QPicture用于记录和重放绘图指令。

QPainter 绘图
绘图事件 void paintEvent()
声明一个画家对象 QPainter painter(this) this指定绘图设备
画线、画圆、画矩形、画文字
设置画笔 QPen 设置画笔宽度 、风格
设置画刷 QBrush 设置画刷 风格

QPainter高级设置
抗锯齿 效率低
painter.setRenderHint(QPainter::Antialiasing);
对画家进行移动
painter.translate(100,0);
保存状态 save
还原状态 restore
如果想手动调用绘图事件 利用update
利用画家画图片 painter.drawPixmap( x,y,QPixmap( 路飞) )

QPaintDevice绘图设备
QPixmap QImage QBitmap(黑白色) QPicture QWidget
QPixmap 对不同平台做了显示的优化
QPixmap pix( 300,300)
pix.fill( 填充颜色 )
利用画家 往pix上画画 QPainter painter( & pix)
保存 pix.save( “路径”)

Qimage 可以对像素进行访问
使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
其他流程和QPixmap一样
可以对像素进行修改 img.setPixel(i,j,value);
QPicture 记录和重现 绘图指令
QPicture pic
painter.begin(&pic);
保存 pic.save( 任意后缀名 )
重现 利用画家可以重现painter.drawPicture(0,0,pic);

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    //绘图事件
    void paintEvent(QPaintEvent *);
    int posX = 0;

private:
    Ui::Widget *ui;
};


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX+=20;
        //如果要手动调用绘图事件 用update更新
        update();
    });

    QTimer * timer = new QTimer(this);
    timer->start(10);

    connect(timer,&QTimer::timeout,[=](){
        posX++;
        update();
    });

}

void Widget::paintEvent(QPaintEvent *)
{
//    //实例化画家对象  this指定的是绘图设备
//    QPainter painter(this);

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


//    //设置画刷
//    QBrush brush(Qt::cyan);
//    //设置画刷风格
//    brush.setStyle(Qt::Dense7Pattern);
//    //让画家使用画刷
//    painter.setBrush(brush);


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

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

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

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

    //////////////////////////////高级设置 ///////////////////////////////

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


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

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

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

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

//    painter.translate(100,0);

//    //还原画家保存状态
//    painter.restore();

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


    /////////////////////////////////利用画家 画资源图片 ///////////////////
     QPainter painter(this);
     QPixmap pix = QPixmap(":/Image/Luffy.png");

    //如果超出屏幕 从0开始
     if(posX >= this->width())
     {
         posX = -pix.width();
     }

     painter.drawPixmap(posX,0,pix);
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值