我正試圖編寫一個基於Qt的應用程序來顯示和操作圖像。
我想要圖像始終展開爲保持其縱橫比的窗口大小。
不幸的是,QLabel沒有選項來保持附加像素圖的高寬比。
所以我寫了一個自定義窗口小部件和實施resizeEvent()和的paintEvent()調整圖像
,寫生:如何像QLabel一樣快速調整圖像大小?
class MyLabel : public QWidget
{
Q_Object
public:
MyLabel(): pixmap("test.tif") {}
protected:
void resizeEvent(QResizeEvent *event)
{
pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio);
}
void paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.drawPixmap(0, 0, pixmap_scaled);
p.end();
}
private:
QPixmap pixmap, pixmap_scaled;
};
但圖像不是那樣平穩QLabel做調整。
然後我看看qlabel.cpp中的QLabel的paintEvent函數,看看它是如何顯示像素圖的。
看來像素圖曾經被轉換爲QImage並縮放到窗口大小
,然後再次轉換爲QPixmap。
我有點驚訝,因爲QPixmap的QImage的和之間的轉換是根據Qt的參考手冊昂貴的操作
,但我想我的窗口小部件的改寫的paintEvent()做同樣的事情
作爲QLabel ::的paintEvent()。然後,調整大小變得如預期慢得多。
我想知道爲什麼調整QLabel的速度如此之快。它是「隱式數據共享」的好處嗎?
當然,因爲私人數據
(如「d指針」)無法訪問,所以將QLabel的paintEvent()複製到我的類是不可能的。
任何幫助,將不勝感激。