Qt:QPainter + GDI在相同的部件?

我试图使用这里描述的方法在同一个小部件上使用QPainter和GDI调用。
不幸的是,这个教程似乎已经写在Qt的早期版本上,现在它不能工作。

我设置WA_PaintOnScreen标志并重新实现paintEngine()返回NULL。

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

 QPainter::begin: Paint device returned engine == 0, type: 1 

这是不是支持了? 我该怎么做?

我也尝试在GDI绘画小部件的顶部创build一个额外的小部件,但是由于顶部小部件显示为黑色并阻止了GDI小部件,所以效果不佳。

Solutions Collecting From Web of "Qt:QPainter + GDI在相同的部件?"

我在QT 4.7-beta 2中得到了如下的工作

  1. 在构造函数中调用setAttribute(Qt :: WA_PaintOnScreen,true);
  2. 不要重新实现paintEngine()返回NULL;
  3. 在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); 

这与Qt 4.0和4.1一起工作,但在奇趣科技重新实现Windows画图引擎时,停止在4.2或4.3的工作。 在Qt 4的第二版中,我们添加了这样一句话:

“为了这个工作,我们还必须重新实现QPaintDevice :: paintEngine()来返回一个空指针,并在小部件的构造函数中设置Qt :: WA_PaintOnScreen属性。

我还没有使用Qt的更新版本(我不再是Trolltech /诺基亚,也没有Windows机器)进行过测试,但我希望它仍然可以正常工作。