脱离Qt的绘图系统(paint system)绘制图形

使用GDI在Qt窗口绘制

在Qt 5.11上测试通过,代码很少,自己看,特地写个博客,希望可以帮到你。

ReplayWidget.h

#pragma once

#include <QWidget>

class ReplayWidget : public QWidget
{
    Q_OBJECT

public:
    ReplayWidget();
    ~ReplayWidget();
protected:
    typedef QWidget base;
    virtual QPaintEngine * paintEngine() const override;
    virtual bool event(QEvent * event) override;
    void paint();
};

ReplayWidget.cpp

#include <Windows.h>
#include <Gdiplus.h>

#include <QEvent>
#include <QPainter>

#include "ReplayWidget.h"


ReplayWidget::ReplayWidget()
{
    setAutoFillBackground(false);
    //setAttribute(Qt::WA_NativeWindow);
    setAttribute(Qt::WA_PaintOnScreen);
}


ReplayWidget::~ReplayWidget()
{
}

QPaintEngine * ReplayWidget::paintEngine() const
{
    return nullptr;
}

bool ReplayWidget::event(QEvent * event) {
    //if (event->type() == QEvent::Paint) {
    //  bool result = base::event(event);
    //  paint();
    //  return result;
    //}
    if (event->type() == QEvent::UpdateRequest) {
        bool result = base::event(event);
        paint();
        return result;
    }
    return base::event(event);
}

void ReplayWidget::paint()
{
    WId handle = winId();
    HDC hdc = GetDC((HWND)handle);
    Gdiplus::Graphics g(hdc);
    auto blueBrush = new Gdiplus::SolidBrush(Gdiplus::Color::Blue);
    RECT rect;
    GetClientRect((HWND)handle, &rect);
    g.FillRectangle(blueBrush, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
    delete blueBrush; blueBrush = nullptr;
    auto redPen = new Gdiplus::Pen(Gdiplus::Color::Red, 2);
    g.DrawArc(redPen, 10, 10, 50, 50, 0, 360);
    SwapBuffers(hdc);
}

参考链接
显示结果
结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值