Windows QT:直接呈现给DC的滚动小部件

Windows QT:直接呈现给DC的滚动小部件,windows,qt,gdi,Windows,Qt,Gdi,我试图创建一个小部件,通过调用getDC()并向其绘制HBITMAP来直接绘制windows设备上下文。 我正在绘制的小部件位于滚动小部件中。 我已经实现了paintEvent(),它看起来确实在画画,但画画之后,小部件立即被重新画成一个空白的灰色 我试过在屏幕上设置WA_painton screen和Qt::WA_NoSystemBackground,但没有任何帮助。 理论上这应该是可能的,因为这基本上就是GLWidget的工作方式 我遗漏了什么?在这里找到了答案: 为了使这一点发挥作用,我

我试图创建一个小部件,通过调用
getDC()
并向其绘制
HBITMAP
来直接绘制windows设备上下文。
我正在绘制的小部件位于滚动小部件中。
我已经实现了
paintEvent()
,它看起来确实在画画,但画画之后,小部件立即被重新画成一个空白的灰色

我试过在屏幕上设置
WA_painton screen
Qt::WA_NoSystemBackground
,但没有任何帮助。
理论上这应该是可能的,因为这基本上就是
GLWidget
的工作方式

我遗漏了什么?

在这里找到了答案:

为了使这一点发挥作用,我们还必须 重新实施
QPaintDevice::paintEngine()
返回 一个空指针,并设置
Qt::WA_painton screen中的属性
小部件的构造函数

void GdiControl::paintEvent(QPaintEvent * /* event */)
{
    RECT rect;
    GetClientRect(winId(), &rect);
    HDC hdc = GetDC(winId());
    FillRect(hdc, &rect, HBRUSH(COLOR_WINDOW + 1));
    SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
    TextOutW(hdc, width() / 2, height() / 2, text.utf16(), text.size());
    ReleaseDC(winId(), hdc);
}