天天看点

脱离Qt的绘图系统(paint system)绘制图形使用GDI在Qt窗口绘制

使用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, );
    g.DrawArc(redPen, , , , , , );
    SwapBuffers(hdc);
}
           

参考链接

显示结果

脱离Qt的绘图系统(paint system)绘制图形使用GDI在Qt窗口绘制

继续阅读