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

2.問題原因
直接原因是view未刷新的問題,所以網(wǎng)上有人使用方案 setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 的方案,但當(dāng)圖片過多時(shí),此方案會(huì)造成畫面閃爍,耗費(fèi)資源等問題。
而根本原因是,boundingRect返回大小的問題,存在兩種情況:
(1)boundingRect 返回的大小,不能完全包含實(shí)際圖形大小,導(dǎo)致刷新不全
(2)boundingRect的左上角頂點(diǎn)位置、長(zhǎng)寬,未補(bǔ)全畫筆寬度,導(dǎo)致原因同(1)
boundingRect函數(shù)功能,是將圖形項(xiàng)的外部邊界定義為一個(gè)矩形。所有的繪圖操作都必須限制在圖形的邊界矩形中,QGraphicsView需要使用這個(gè)邊界來確定重繪的區(qū)域。
而邊界的寬度,精確為畫筆寬度的的一半。
3.修改方案
boundingRect的左上角頂點(diǎn),需要補(bǔ)充畫筆寬度/2,實(shí)際矩形的長(zhǎng)寬,補(bǔ)全畫筆寬度
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);
}到此這篇關(guān)于Qt QGraphicsItem 移動(dòng)時(shí)出現(xiàn)殘影問題記錄的文章就介紹到這了,更多相關(guān)Qt QGraphicsItem 移動(dòng)殘影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08
C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比
這篇文章主要介紹了C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比,分別用于讀取組格式函數(shù)和讀取密碼格式,需要的朋友可以參考下2015-08-08

