QGraphicsScene繪製背景圖片引起的問題

2021-01-10 程式設計師fearlazy

項目是基於Qt的圖形視圖框架編寫的,現有個需求是要在圖形中加入自定義的背景圖片。心想不就是個背景圖片嗎?只要重寫drawBackground函數我想怎麼畫就怎麼畫啊。於是立馬從QGraphicsScene類中派生了一個CScene類,並重寫了虛函數drawBackground。在該函數中繪製了一張圖片。

void CScene::drawBackground(QPainter *painter, const QRectF &rect){QPixmap pixmap("F:/05_test/back.jpg"); painter->drawPixmap(rect,pixmap,QRect()); //在rect範圍內繪製圖片}

看看這效果,so easy啊。但是如果故事到這裡就結束的話那就沒意思了。 接下來我在場景中添加了兩個矩形圖元並拖動一個矩形。於是出現了詭異的一幕。

//創建並添加兩個矩形圖元到場景中

QGraphicsRectItem* rectItem1 = new QGraphicsRectItem(-20,-20,40,40);

rectItem1->setFlag(QGraphicsItem::ItemIsMovable);

QGraphicsRectItem* rectItem2 = new QGraphicsRectItem(-30,-30,60,60);

rectItem2->setFlag(QGraphicsItem::ItemIsMovable);

rectItem2->setPos(100,100);

m_pScene->addItem(rectItem1);

m_pScene->addItem(rectItem2);

戒指不見了!戒指跑哪裡去了?

扯遠了,其實是圖形中出現了殘影現象,那麼為什麼會有殘影呢?難道是圖元的刷新範圍不正確嗎?於是設置視圖的更新模式試試。

m_pView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

設置為FullViewportUpdate後重啟程序再拖動圖元發現殘影不見了。

然而事情到這一步還是沒有結束,接下來我又在視圖上加了個QLabel,並且嘗試移動它。

label = new QLabel(m_pView); label->setStyleSheet("background:red;"); label->setFixedSize(100,100); label->move(100,50);

戒指又不見了!(殘影又出現了)。看來設置視圖的更新模式只能對圖元起作用啊。

那怎麼辦呢?仔細觀察第一次出現的殘影,會發現矩形圖元裡居然也有背景圖片。我們並沒有給圖元設置背景圖片啊,這就更詭異了。

其實矩形圖元裡的背景圖片並不屬於矩形圖元,之前出現的殘影也不是更新圖元或QLabel產生的。一切都是drawBackground的第二個參數在搞鬼。Qt幫助文檔告訴我們rect是指暴露的矩形,我還以為是視圖當前可視的矩形區域。然而事實卻不是這樣。列印出rect的值:

rect: QRectF(-133,-83 376x276)

rect: QRectF(67,66 66x67)

rect: QRectF(67,65 66x67)

程序剛啟動時rect的大小是視圖的窗口大小,拖動圖元時函數給我們的rect只是比圖元大一點,很顯然不能滿足我們的需求,至於為什麼是這樣也不知道。所以我們需要繪製的圖片始終和視圖一樣大需要自己計算,可以這麼寫。

if(views().count() == 0) return; QGraphicsView* pView = views().first(); QRect contentRect = pView->viewport()->contentsRect(); QRectF sceneRect = pView->mapToScene(contentRect).boundingRect(); QPixmap pixmap("F:/05_test/back.jpg"); painter->drawPixmap(sceneRect,pixmap,QRect()); //在rect範圍內繪製圖片

測試環境:Qt5.9.4

相關焦點

  • scene
    scene scene的解釋及scene的例句
  • 英語詞彙學習:scenery和scene可以混用嗎?
    新東方網>英語>英語學習>語法詞彙>分類詞彙>正文英語詞彙學習:scenery和scene可以混用嗎?電影、書中表現的「場面、場景」   比如fight/ action/ movie scene   打鬥/動作/電影場面   2. 事故、犯罪等的「現場」   比如crime/ accident scene   犯罪/事故現場   3.
  • 英語詞彙指導:scene與scenery的用法區別
    新東方網>英語>英語學習>語法詞彙>詞彙指導>正文英語詞彙指導:scene與scenery的用法區別 2012-12-13 21:01 來源:可可英語 作者:
  • 英語make a scene 的用法
    英語中,make a scene 是一個很有意思的詞組,scene 是場景的意思,make a scene 卻是大發脾氣的意思,尤其是指當眾大吵大鬧的發脾氣。今天我們一起通過幾個例句來學習一下。例句1:Did you make a scene with him again?
  • scene和scenery的區別
    1.scene是可數名詞主要表示下面4種意思:(1)劇中的場景或,一場或一段情節。(2)故事、事件發生的地點、場所。(3)風景,場面。(4)爭吵,吵鬧。The firstscene in the second act contains a lengthy soliloquy. 第二幕中的第一場有一段很長的獨白。Thescene of the story is Victorian England. 這個故事發生在維多利亞時代的英國。
  • 英語詞彙指導:view,sight,scene,scenery的用法區別
    新東方網>英語>英語學習>語法詞彙>詞彙指導>正文英語詞彙指導:view,sight,scene,scenery的用法區別 2012-12-13 21:01 來源:可可英語 作者:
  • Scene課堂|莫氏硬度
    好的主題式教學有利於幫助學生合理的構建知識框架,能夠有效的鍛鍊學生嚴密的邏輯思維,培養學生自主探究問題的能力,體現了課程改革的理念。        大自然工作坊所有成員每周精選一個主題,選擇四至五個學科知識切入,家長可以利用scene課堂內容和自己的孩子對話,爭取在家裡展開主題式學習方法。學校裡的老師可以提供更多思路給我們,也可以利用這個案例進行教學。
  • view, sight, scenery, and scene的用法
    view, sight, scenery, and scene的用法view指從某處所看到的風景或景色。You can have a good view of the river from this power.從這個塔上你可以看清那條河。sight指視線範圍內的景象或情景,用複數時多指用於觀光的名勝。
  • 朋友圈背景一束光圖片 微信朋友圈背景圖一束光圖片匯總2020
    導讀:最近抖音裡面有一組很火的朋友圈背景圖,叫做黑暗裡的一束光,非常的特別有個性。朋友圈背景一束光圖片,想要換上的朋友,看看文中的介紹吧。   2020微信朋友圈黑暗中的一束光背景在哪下載呢?最近微信朋友圈流行了這麼一組背景圖,那就是在黑暗中投射的一束光,光影中寫滿了對2020年的期待,大家是不是想看看都有哪些圖片呢?
  • 2013年3月21日 「普朗克」繪製出宇宙微波背景輻射圖
    2013年3月21日 「普朗克」繪製出宇宙微波背景輻射圖2018-03-21 15:35 來源: 科普中國 2013年3月21日2013年3月21日,「普朗克」太空探測器傳回數據繪製出宇宙微波背景輻射圖。
  • 《Widgetsmith》背景圖片設置方法
    《Widgetsmith》是一款非常好用的小組件APP,隨著IOS14系統的上線,該APP使用的用戶越來越多了,但是很多小夥伴不知道Widgetsmith怎麼設置背景圖片,下面小編就給大家帶來《Widgetsmith》背景圖片設置方法,一起來看看吧!
  • 日本藝術家繪製3D圖片,網友認為神了,這是真正的章魚
    經常令我們震驚的藝術品之一是繪製以下形式的逼真的3D圖像:海波龍 (超現實主義)從2000年開始流行,在最近的20年中,有很多優秀的藝術家。但並不是每個人都會讓你像這個人一樣感到驚訝日本青年畫家,他為書籍和雜誌繪製漫畫 展現他讓網友驚訝的潛力,繪製的「章魚」令人難以置信的真實感,並且看起來像3D圖像,好像它根本不是一幅畫。他在網上發布了自己作品的圖片,馬上就火遍全球。。
  • 2020微信主題背景圖片如何更換
    一款主題背景圖片能夠讓人感覺到賞心悅目,使用在微信之中,也讓人感覺到一片清爽,有些用戶對於2020微信主題背景圖片如何更換並不了解,想要對其背景圖片展開更換,遠沒有那麼複雜,按照如下方式即可完成。3.進入聊天頁面之後,選擇聊天背景。4.進入該頁面之後,可以看到有三類選擇,第1類選擇為用戶可以直接選擇在線圖片,在線圖片需要下載後方可使用。5.第2類選擇為從用戶的手機相冊中篩選圖片,使用時要將相冊中的圖片上傳到微信之中,作為後期更換背景的圖片。
  • 怎樣拍攝剪影和純黑背景圖片?
    下圖在傍晚時採用點測光,對湖面明亮適中部分測光,用光圈優先模式拍攝的剪影圖片。從照片可以看出,湖面細節曝光正常,人物主體細節完全消失,湖面反光處過曝,形成了一副明暗反差明顯的剪影畫面。下圖是在太陽剛剛落下,天空還有些許餘光,且有非常漂亮的晚霞,用光圈優先,點測光對天空明亮適中部分測光,拍攝出唯美的剪影人像。
  • 攝影乾貨,黑色背景圖片怎麼拍?一塊黑布就搞定
    拍攝花卉、靜物、水花飛濺的場景時,我們喜歡黑色背景去除雜物,更好地表達我們的拍攝主體。那黑色背景怎麼拍?可以使用閃光燈壓光、找深色背景角度等等。但其實一塊黑布就能解決這個問題了,沒有黑布,用黑衣服也可以,不需要用到閃光燈。
  • ...of villages" precise poverty alleviation action scene will...
    The "thousand enterprises to help thousands of villages" precise poverty alleviation action scene will be held in Ji'an County.
  • 由一張圖片引起的文章—天仙子
    圖片中的植物名為天仙子,在昨天的攝影圈中曬了這張圖片,原本只是簡單的打卡,為了讓大家看看兩張圖哪張更好看卻出現了我預想不到的情景,兩張圖片竟然引起了近四十萬的瀏覽量,一千多條評論。更有趣的是大家的評論:說沒有放大的圖片像樹上站著小鳥的,樹上蹲著一群老鼠的,樹枝上做著一群貓,屁股對著大家的,還有說像燒賣的,原來沒有發現一張簡單的圖片可以引發大家無限的遐想。更有很多人問我,這麼可愛的植物是什麼?
  • 宇宙微波背景輻射:創世的第一縷曙光
    Penzias 和 Wilson 發現背景輻射的 Holmdel 喇叭形天線(圖片來源:NASA)宇宙背景輻射的不均勻性基於宇宙學基本原理,大尺度上,宇宙是均勻、各向同性的,所以宇宙背景輻射應當也是各向同性的。
  • 【查看】圖片的拍攝地點和日期時間等信息
    __biz=MzI2MTE0NTE3Mw==&mid=2651104271&idx=1&sn=86558d176a72c9459c3fa47661d3b2ed&chksm=f1aed335c6d95a2300ad4fb8c375548508dbf4d927c7cd5c50f89a73f20affa6f96e68f17f28&mpshare=1&scene