QT: виджет прокрутки, который отображает непосредственно в DC

Я пытаюсь создать виджет, который рисует непосредственно в контексте устройства Windows, вызывая getDC() и закрашивая его HBITMAP.
Виджет, который я рисую, находится внутри виджета прокрутки.
Я реализовал paintEvent() и он, кажется, рисует, но сразу после рисования виджет снова закрашивается пустым серым цветом.

Я пробовал установить WA_PaintOnScreen и Qt::WA_NoSystemBackground, но ничего из этого не помогло.
Теоретически это должно быть возможно, поскольку именно так работает GLWidget.

Что мне не хватает?


person shoosh    schedule 22.03.2010    source источник


Ответы (1)


Нашел ответ здесь:

http://www.qtchina.net/qt4c++guiprogramming/ch20lev1sec1.html/

void GdiControl::paintEvent(QPaintEvent * /* event */)
{
    RECT rect;
    GetClientRect(winId(), &rect);
    HDC hdc = GetDC(winId());
    FillRect(hdc, &rect, HBRUSH(COLOR_WINDOW + 1));
    SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
    TextOutW(hdc, width() / 2, height() / 2, text.utf16(), text.size());
    ReleaseDC(winId(), hdc);
}

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

person shoosh    schedule 23.03.2010