gpt4 book ai didi

c++ - Qt:Qt5 Windows 中 BitBlt 的替代品

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:50 25 4
gpt4 key购买 nike

我目前正在将开源解决方案(Albatross ATM 解决方案 http://www.albatross.aero/)从 Qt3 移植到 Qt5。信天翁是空中交通观察员,需要非常好的表现。我已经能够处理各种问题,但不能处理显示部分。

显示架构基于 bitblt 命令,该命令首先将一个像素图复制到另一个像素图,最后将像素图复制到屏幕。

这是 Qt3 显示代码(工作和性能):

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

QPainter tmp;

for (int lay=0;lay<(int)m_RectTable.size();lay++) //For each drawing layer (there are 3)
{

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(),CopyROP); //m_BitmapTable is a QVector< QPixmap* >, m_RectTable is a QVector<QRect>

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(), CopyROP);
}

我尝试用 drawPixmap 替换 bitblt 但性能很差,因为我必须经常显示屏幕。

这是新的 Qt5 代码:

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

for (int lay=0;lay<(int)m_RectTable.size();lay++)
{
if (!m_RectTable.at(lay).isEmpty())
{
tmp2.begin(m_BitmapTable[lay]);

if (lay != 0)
{
tmp.drawPixmap(m_RectTable[lay].left(), m_RectTable[lay].top(), *m_BitmapTable.at(lay - 1), m_RectTable[lay].left(), m_RectTable[lay].top(), m_RectTable[lay].width(), m_RectTable[lay].height());//TOCHECK
m_BitmapTable[lay] = m_BitmapTable[lay - 1].copy(m_RectTable[lay]);
}

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

OnDraw(&tmp, lay);
tmp.end();
m_RectTable[lay].setRect(0, 0, -1, -1);
}
}
tmp.begin(this);
tmp.drawPixmap(rcBounds.left(), rcBounds.top(), m_BitmapTable.at(m_LayerNb - 1), rcBounds.left(), rcBounds.top(), rcBounds.width(), rcBounds.height());
tmp.end();
}
  • 对于层,有 3 个层。第 0 层是最深的(背景),第 2 层是最高的。使用此配置是为了确保空中交通始终显示在屏幕顶部。

  • OnDraw 方法根据层绘制自上次 paintEvent 后发生变化的元素

问:您是否知道我可以如何改进此 paintEvent 方法以恢复良好的行为并再次使用 Qt5 获得良好的性能?

最佳答案

我在这里发现了问题。

drawPixmap/drawImage 显然是 Qt4/Qt5 中 bitblt 的最佳替代品。不幸的是,我在使用 QPixmap 的 scaled() 方法时遇到了一些问题(用在此处未显示的另一段代码中......),这给我带来了不好的结果。我不得不从 pixmap.resize() 转到 pixmap.scaled(),我在这里犯了一个错误。

我改变了它,现在我显然有一个很好的结果。因此,对于像我这样仍在疑惑的人来说,Qt 中用于 Bitblt 的最佳替代方案是使用 QPainter 的 drawPixmap。

关于c++ - Qt:Qt5 Windows 中 BitBlt 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com