我试图使用这里描述的方法在同一个小部件上使用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小部件,所以效果不佳。
我在QT 4.7-beta 2中得到了如下的工作
在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机器)进行过测试,但我希望它仍然可以正常工作。