Hello 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函数用于显示我的应用程序的整个元素,如弹出窗口等......(用于不同的图形层)。
如果有任何遗漏的信息可以更好地了解我的问题,请随时问我!
非常感谢你的帮助!
答案 0 :(得分:0)
感谢Frank Osterfeld,我想通了。问题来自这些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方法用于什么?
感谢您的帮助