Qt5: от BitBlt до QPainter :: drawImage

Привет эксперты StackOverflow,

Я довольно новичок в Qt, и в настоящее время я обновляю профессиональное приложение с QT4 до QT5.

У меня проблема с BitBlt что нужно обновить до QPainter :: drawImage.

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

Вот мой предыдущий код

void View::paintEvent ( QPaintEvent * Event)
{
QRect   rcBounds=Event->rect();
QPainter tmp(this);

for (int lay=0;lay<(int)m_RectTable.size();lay++)
{
if (!m_RectTable[lay].isEmpty())
{
if (lay != 0)
{
bitBlt(m_BitmapTable[lay], m_RectTable[lay].left(), m_RectTable[lay].top(), m_BitmapTable[lay - 1], m_RectTable[lay].left(), m_RectTable[lay].top(), m_RectTable[lay].width(), m_RectTable[lay].height(), QPainter::CompositionMode_SourceOver);
}

tmp.begin(m_BitmapTable[lay]);

if (lay==0)
tmp.fillRect(m_RectTable[lay], *m_pBrush);

OnDraw(&tmp, lay);
tmp.end();
m_RectTable[lay].setRect(0, 0, -1, -1);
}
}
bitBlt(this, rcBounds.left(), rcBounds.top(),m_BitmapTable[m_LayerNb-1],rcBounds.left(), rcBounds.top(),rcBounds.width(), rcBounds.height(), QPainter::CompositionMode_SourceOver);
}

И я заменил:

bitBlt(m_BitmapTable[lay], m_RectTable[lay].left(), m_RectTable[lay].top(), m_BitmapTable[lay - 1], m_RectTable[lay].left(), m_RectTable[lay].top(), m_RectTable[lay].width(), m_RectTable[lay].height(), QPainter::CompositionMode_SourceOver);

а также

bitBlt(this, rcBounds.left(), rcBounds.top(),m_BitmapTable[m_LayerNb-1],rcBounds.left(), rcBounds.top(),rcBounds.width(), rcBounds.height(), QPainter::CompositionMode_SourceOver);

с:

tmp.drawPixmap(m_RectTable[lay].left(), m_RectTable[lay].top(), *m_BitmapTable[lay - 1], m_RectTable[lay].left(), m_RectTable[lay].top(), m_RectTable[lay].width(), m_RectTable[lay].height());
tmp.drawPixmap(rcBounds.left(), rcBounds.top(), *m_BitmapTable[m_LayerNb - 1], rcBounds.left(), rcBounds.top(), rcBounds.width(), rcBounds.height());

Эта функция paintEvent используется для отображения всех элементов моего приложения, таких как всплывающее окно и т. Д. (Layer для разных графических слоев).

  • Что-то не так с моим способом обновления bitblt?
  • Должен ли я иметь другую архитектуру, потому что bitblt и drawImage не работают одинаково?

Если есть какая-либо недостающая информация, чтобы лучше понять мою проблему, не стесняйтесь спрашивать меня!

Большое спасибо за Вашу помощь !

0

Решение

Я понял это благодаря Фрэнку Остерфельду. Проблема исходила от этих методов beign () и end (). Там были, вероятно, не очень хорошо. Я не знаю точно, для чего они используются, но я удалил их, и теперь, похоже, это работает очень хорошо.

Итак, вот новый код:

void View::paintEvent ( QPaintEvent * Event)
{
QRect   rcBounds=Event->rect();

QPainter tmp(this);

for (int lay=0;lay<(int)m_RectTable.size();lay++)
{
if (!m_RectTable[lay].isEmpty())
{
if (lay != 0)
{
tmp.drawPixmap(m_RectTable[lay], *m_BitmapTable.at(lay - 1), m_RectTable[lay]);
}

if (lay==0)
tmp.fillRect(m_RectTable[lay], *m_pBrush);

OnDraw(&tmp, lay);
m_RectTable[lay].setRect(0, 0, -1, -1);
}
}
tmp.drawPixmap(rcBounds, *m_BitmapTable.at(m_LayerNb - 1), rcBounds);
}

У меня все еще есть один вопрос, для чего предназначены методы QPainter :: begin и QPainter :: end?

Спасибо за помощь

0

Другие решения


По вопросам рекламы [email protected]