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

时间:2010-04-11 07:46:57

标签: windows qt gdi paint

我正在尝试使用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小部件,因此效果不佳。

2 个答案:

答案 0 :(得分:3)

我在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);
    

答案 1 :(得分:1)

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

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

我没有使用更高版本的Qt测试它(我不再在Trolltech /诺基亚,也没有Windows机器),但我希望它仍然可以使用。