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è)邊界來(lái)確定重繪的區(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語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08C語(yǔ)言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比
這篇文章主要介紹了C語(yǔ)言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對(duì)比,分別用于讀取組格式函數(shù)和讀取密碼格式,需要的朋友可以參考下2015-08-08