2015-06-01 90 views
0

你好StackOverflow的專家,QT5:與BitBlt到了QPainter ::的drawImage

我在Qt的漂亮的小白和我目前從升級到QT4一個QT5應用profesionnal。

我有一個問題,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函數用於顯示我的應用程序的全部元素,例如彈出窗口等等(lay是針對不同的圖形層)。

  • 我的升級bitblt的方式有什麼問題嗎?
  • 我應該有不同的體系結構,因爲bitblt和drawImage工作方式不一樣嗎?

如果有任何缺失的信息有更好的理解我的問題隨時問我!

非常感謝您的幫助!

+1

您在end()(在循環中)之後調用drawPixmap()。在繪畫前試着用tmp.begin(),或者創建一個新的畫家。 –

回答

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方法?

感謝您的幫助