代码之家  ›  专栏  ›  技术社区  ›  shoosh

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

  •  1
  • shoosh  · 技术社区  · 14 年前

    我在试着使用 method described here 在同一个小部件上使用QPaint和GDI调用。
    不幸的是,本教程似乎是在Qt的早期版本上编写的,现在它不起作用了。

    我设定了 WA_PaintOnScreen 标志和重新实施 paintEngine() 返回NULL。

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

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

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

    我还尝试在GDI绘制小部件的顶部创建一个额外的小部件,但效果不太好,因为顶部的小部件显示为黑色并阻止GDI小部件。

    2 回复  |  直到 11 年前
        1
  •  3
  •   sschilz    14 年前

    我在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);
      
        2
  •  1
  •   shoosh    14 年前

    这在Qt 4.0和4.1中起作用,但在Trolltech重新实现Windows喷漆引擎时,在4.2或4.3中都停止了作用。在Qt 4的第二版中,我们添加了以下句子:

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

    我还没有使用更高版本的Qt测试过它(我不再在Trolltech/Nokia工作,也没有Windows机器),但我希望它仍能工作。