2014-04-22 27 views
2

我想一些QImage通過QGraphicsScene顯示,我的代碼的很直白:如何使用QGraphicsScene :: addPixmap當它只接受常量QPixmap?

mainwindow.h

QImage *sourceImage; 
QGraphicsView *imageView; 
QGraphicsScene *imageScene; 

mainwindow.cpp

imageScene = new QGraphicsScene; 
imageView = new QGraphicsView; 
imageView->setScene(imageScene); 

sourceImage = new QImage; 
sourceImage.load(":/targetimage.png"); 
imageScene.addPixmap(QPixmap::fromImage(sourceImage)); 

然後是編譯正確指出我做錯了什麼:QGraphicsScene::addPixmap只接受const QPixmap作爲參數,我試圖將QImage轉換爲const QPixmap,這是不允許的,因爲QPixmap::fromImage內只接受const QImage,就像const地獄一樣。

這種方法的official documentation沒有多大意義,我不是,我是否願意做,例如,一個圖像瀏覽器,並在運行時我想不同的圖像,確保加載到QImage sourceImage,我怎麼能使用const QImage完成這項工作?

這個問題一直在痛苦,謝謝你的任何建議。此外,如果對Qt中的人爲什麼使用const這些方法的哲學理由有任何看法,您是否可以點亮我?

+0

什麼阻止您使用QPixmaps而不是QImages? – vahancho

+0

我正在使用opencv,這意味着我將const'cv :: Mat'轉換爲'QImage'並返回。根據文檔,「QPixmap」針對顯示進行了優化。我相信有一些方法可以將'QPixmap'轉換爲cv :: Mat,但是'QImage'完全適合問題空間。 – timfeirg

回答

2

嘗試

imageScene.addPixmap(QPixmap::fromImage(*sourceImage)); 

幾點建議:

沒有必要分配的QImage在堆上(使用新的)。 用途:

QImage sourceImage; 

然後調用QPixmap::fromImage

當我想弄清楚你不需要取消引用指針:常量性無關與錯誤。

+0

這很簡單,鼓舞人心。我已經對指針進行了一些閱讀並更新了我的C++知識,但是我無法抗拒,因爲'sourceImage'指向'QImage'而不是'const QImage'類型,爲什麼像'QPixmap :: fromImage(const QImage)仍然接受'* sourceImage'作爲有效的參數? – timfeirg

+0

因爲限制只有一種。如果方法有一個const參數,這意味着承諾不會改變你傳入的內容。 如果相反,你傳遞一個const對象作爲一個非const參數,你應該給一些永遠不應該修改的函數,說明'我將修改' – Bgie

+0

雖然這解決了一個問題timfeirg似乎(不理解函數的const參數只是函數的一個承諾,不會改變這個參數),它並不回答他在那裏問的問題,即: 爲什麼一個函數有記錄簽名說它只需要一個對象作爲參數,而不是接受一個POINTER作爲參數的對象?那如何編譯? 我對此沒有答案。我認爲這有點神奇。 –

相關問題