Qt?QGraphicsItem?移動時出現(xiàn)殘影問題記錄
1.問題現(xiàn)象
自定義 QGraphicsItem 時,繪制rect,對象移動時出現(xiàn)殘影。

2.問題原因
直接原因是view未刷新的問題,所以網(wǎng)上有人使用方案 setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 的方案,但當圖片過多時,此方案會造成畫面閃爍,耗費資源等問題。
而根本原因是,boundingRect返回大小的問題,存在兩種情況:
(1)boundingRect 返回的大小,不能完全包含實際圖形大小,導致刷新不全
(2)boundingRect的左上角頂點位置、長寬,未補全畫筆寬度,導致原因同(1)
boundingRect函數(shù)功能,是將圖形項的外部邊界定義為一個矩形。所有的繪圖操作都必須限制在圖形的邊界矩形中,QGraphicsView需要使用這個邊界來確定重繪的區(qū)域。
而邊界的寬度,精確為畫筆寬度的的一半。
3.修改方案
boundingRect的左上角頂點,需要補充畫筆寬度/2,實際矩形的長寬,補全畫筆寬度
QRectF CGraphicsDragItem::boundingRect() const
{
return QRectF(
-m_penWidth/2,
-m_penWidth/2,
m_rectWidth+m_penWidth,
m_rectHeight+m_penWidth);
}
void CGraphicsDragItem::paint(
QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
if (hasFocus() || !collidingItems().isEmpty())
{
m_penWidth = 10;
painter->setPen(QPen(QColor(255, 255, 255, 200), m_penWidth));
if (hasFocus())
{
for (auto it : collidingItems())
{
it->update();
}
}
}
else
{
m_penWidth = 1;
painter->setPen(QPen(QColor(100, 100, 100, 100), m_penWidth));
}
painter->setBrush(m_clrBrush);
painter->drawEllipse(0, 0, m_rectWidth, m_rectHeight);
}到此這篇關于Qt QGraphicsItem 移動時出現(xiàn)殘影問題記錄的文章就介紹到這了,更多相關Qt QGraphicsItem 移動殘影內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言數(shù)據(jù)結構之順序數(shù)組的實現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結構之順序數(shù)組的實現(xiàn)的相關資料,這里提供實現(xiàn)實例,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08
C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對比
這篇文章主要介紹了C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對比,分別用于讀取組格式函數(shù)和讀取密碼格式,需要的朋友可以參考下2015-08-08

