1

ここで説明されている方法を使用して、同じウィジェットで QPainter と GDI 呼び出しを使用しようとしています。
残念ながら、このチュートリアルは以前のバージョンの Qt で書かれたようで、現在は機能しません。

NULL を返すようにWA_PaintOnScreenフラグと再実装を設定します。paintEngine()

次に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. NULL を返すように paintEngine() を再実装しないでください。
  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 で機能しましたが、Trolltech が Windows ペイント エンジンを再実装したときに、4.2 または 4.3 で機能しなくなりました。Qt 4 ブックの第 2 版では、次の文を追加しました。

「これを機能させるには、QPaintDevice::paintEngine() を再実装して null ポインターを返し、ウィジェットのコンストラクターで Qt::WA_PaintOnScreen 属性を設定する必要があります。」

Qt の新しいバージョンを使用してテストしたことはありません (私はもう Trolltech/Nokia に所属しておらず、Windows マシンを持っていません) が、それでも動作することを願っています。

于 2010-04-11T10:33:11.957 に答える