使用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);
}
参考链接
显示结果
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX1Z1RhpWOxoVdsd0YsJlMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM4MTMzYTNwEzNxkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)