1

我正在尝试使用此处描述的方法在同一个小部件上使用 QPainter 和 GDI 调用。
不幸的是,本教程似乎是在早期版本的 Qt 上编写的,现在它不起作用。

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

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

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

这根本不再支持吗?我该怎么做?

我还尝试在 GDI 绘画小部件之上创建一个额外的小部件,但效果不佳,因为顶部小部件显示为黑色并阻挡了 GDI 小部件。

4

2 回答 2

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);
    
于 2010-07-22T17:41:53.280 回答
1

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

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

我没有使用更高版本的 Qt 测试它(我不再在 Trolltech/Nokia 并且没有 Windows 机器)但我希望它仍然可以工作。

于 2010-04-11T10:33:11.957 回答