Windows Qt:QPainter+GDI在同一个小部件中?

Windows Qt:QPainter+GDI在同一个小部件中?,windows,qt,gdi,paint,Windows,Qt,Gdi,Paint,我正在尝试使用来在同一个小部件上使用QPaint和GDI调用。 不幸的是,本教程似乎是在Qt的早期版本上编写的,现在它不起作用了 我将WA_PaintOnScreen标志和重新实现paintEngine设置为返回NULL 然后在paintEvent上创建一个QPaint,使用它,然后使用一些GDI调用来绘制位图。GDI称工作正常,但QPainter什么也不做。我在控制台上遇到以下错误: QPainter::begin: Paint device returned engine == 0, typ

我正在尝试使用来在同一个小部件上使用QPaint和GDI调用。 不幸的是,本教程似乎是在Qt的早期版本上编写的,现在它不起作用了

我将WA_PaintOnScreen标志和重新实现paintEngine设置为返回NULL

然后在paintEvent上创建一个QPaint,使用它,然后使用一些GDI调用来绘制位图。GDI称工作正常,但QPainter什么也不做。我在控制台上遇到以下错误:

QPainter::begin: Paint device returned engine == 0, type: 1
这是否不再得到支持?我怎么做


我还尝试在GDI绘制小部件的顶部创建一个额外的小部件,但效果不太好,因为顶部小部件显示为黑色并阻止GDI小部件。

这在Qt 4.0和4.1中起作用,但在Trolltech重新实现Windows绘制引擎时,在4.2或4.3中停止工作。在Qt 4第二版书中,我们添加了以下句子:

为了实现这一点,我们还必须重新实现QPaintDevice::paintEngine以返回空指针,并在小部件的构造函数中设置Qt::WA_PaintOnScreen属性


我还没有用更高版本的Qt测试过它,我不再在Trolltech/Nokia工作,也没有Windows机器,但我希望它仍能工作

这适用于Qt 4.0和4.1,但当Trolltech重新实现Windows喷漆引擎时,它在4.2或4.3中停止工作。在Qt 4第二版书中,我们添加了以下句子:

为了实现这一点,我们还必须重新实现QPaintDevice::paintEngine以返回空指针,并在小部件的构造函数中设置Qt::WA_PaintOnScreen属性


我还没有用更高版本的Qt测试过它,我不再在Trolltech/Nokia工作,也没有Windows机器,但我希望它仍能工作

我在Qt4.7-beta 2中实现了如下功能

在构造函数调用setAttributeQt::WA_PaintOnScreen中,true; 不要重新实现paintEngine以返回NULL; 在paintEvent中使用以下代码

QPainter painter(this);
HDC hdc = painter.paintEngine()->getDC();   // THIS IS THE CRITICAL STEP! 
HWND hwnd = winID();

   // From this point on it is all regular GDI 
QString text("Test GDI Paint");
RECT rect;
GetClientRect(hwnd, &rect);

HBRUSH hbrRed = CreateSolidBrush(RGB(255,0,0));
FillRect(hdc, &rect, hbrRed);
HBRUSH hbrBlue = CreateSolidBrush(RGB(40,40,255));
HPEN bpenGreen = CreatePen(PS_SOLID, 4, RGB(0,255,0));
SelectObject(hdc,bpenGreen);
SelectObject(hdc,hbrBlue);

Ellipse(hdc,10,10,rect.right-20,rect.bottom-20);
SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
TextOutW(hdc, width() / 2, height() / 2, text.utf16(), text.size());
ReleaseDC(hwnd, hdc);

我在Qt4.7-beta 2中得到了如下结果

在构造函数调用setAttributeQt::WA_PaintOnScreen中,true; 不要重新实现paintEngine以返回NULL; 在paintEvent中使用以下代码

QPainter painter(this);
HDC hdc = painter.paintEngine()->getDC();   // THIS IS THE CRITICAL STEP! 
HWND hwnd = winID();

   // From this point on it is all regular GDI 
QString text("Test GDI Paint");
RECT rect;
GetClientRect(hwnd, &rect);

HBRUSH hbrRed = CreateSolidBrush(RGB(255,0,0));
FillRect(hdc, &rect, hbrRed);
HBRUSH hbrBlue = CreateSolidBrush(RGB(40,40,255));
HPEN bpenGreen = CreatePen(PS_SOLID, 4, RGB(0,255,0));
SelectObject(hdc,bpenGreen);
SelectObject(hdc,hbrBlue);

Ellipse(hdc,10,10,rect.right-20,rect.bottom-20);
SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
TextOutW(hdc, width() / 2, height() / 2, text.utf16(), text.size());
ReleaseDC(hwnd, hdc);

这句话已经在我链接的在线版本中了。请注意,画图引擎为空是触发我所指错误消息的原因。@shoosh:我认为您没有在原始帖子中添加链接。这句话已经出现在我链接到的在线版本中。请注意,画图引擎为空是触发我所指的错误消息的原因。@shoosh:我认为您没有在原始帖子中添加链接。