我正在尝试使用method described here在同一个小部件上使用QPainter和GDI调用。
不幸的是,本教程似乎是在早期版本的Qt上编写的,现在它不起作用。
我设置WA_PaintOnScreen
标志并重新实现paintEngine()
以返回NULL。
然后在paintEvent()
我创建一个QPainter,使用它然后使用一些GDI调用来绘制位图。 GDI调用工作正常,但QPainter什么都不做。我在控制台上收到以下错误:
QPainter::begin: Paint device returned engine == 0, type: 1
这根本不再受支持了吗?我怎么能这样做?
我还尝试在GDI绘制小部件之上创建一个额外的小部件,但由于顶部小部件显示为黑色并阻止GDI小部件,因此效果不佳。
答案 0 :(得分:3)
我在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);
答案 1 :(得分:1)
这适用于Qt 4.0和4.1,但当Trolltech重新实现Windows绘图引擎时,在4.2或4.3中停止工作。在Qt 4书的第二版中,我们添加了句子:
“为此,我们还必须重新实现QPaintDevice :: paintEngine()以返回空指针并在小部件的构造函数中设置Qt :: WA_PaintOnScreen属性。”
我没有使用更高版本的Qt测试它(我不再在Trolltech /诺基亚,也没有Windows机器),但我希望它仍然可以使用。