Qt: QPainter + GDI в том же виджете? - PullRequest
1 голос
/ 11 апреля 2010

Я пытаюсь использовать метод , описанный здесь , чтобы использовать вызовы QPainter и GDI для одного и того же виджета.
К сожалению, это руководство, похоже, было написано для более ранней версии Qt, и теперь оно не работает.

Я установил флаг WA_PaintOnScreen и переопределил paintEngine() для возврата NULL.

Затем на paintEvent() я создаю QPainter, использую его, а затем использую некоторые вызовы GDI для рисования растрового изображения. Вызовы GDI работают нормально, но QPainter ничего не делает. Я получаю следующую ошибку на консоли:

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

Это просто больше не поддерживается? как я могу это сделать?

Я также пытался создать дополнительный виджет поверх виджета GDI-рисования, но это не очень хорошо, поскольку верхний виджет выглядит черным и блокирует виджет GDI.

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

Я получил это, работая в QT 4.7-бета 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 голос
/ 11 апреля 2010

Это работало с Qt 4.0 и 4.1, но перестало работать в 4.2 или 4.3, когда Trolltech повторно реализовал движок рисования Windows. Во втором издании книги Qt 4 мы добавили предложение:

"Чтобы это работало, мы также должны переопределить QPaintDevice :: paintEngine (), чтобы вернуть нулевой указатель и установить атрибут Qt :: WA_PaintOnScreen в конструкторе виджета."

Я не тестировал его, используя более поздние версии Qt (я больше не в Trolltech / Nokia и у меня нет машины с Windows), но я надеюсь, что он все еще будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...