1. 程式人生 > >向QWidget中新增圖片,並使圖片隨窗體大小縮放

向QWidget中新增圖片,並使圖片隨窗體大小縮放

向QWidget中新增圖片有多種方式,其中一種方法如下:

// 部分核心程式碼片段 在Qt 5.7中編譯通過
QWidget * widget = new QWidget;
widget->setAtuoFillBackground(true);
QImage image;
QPalette palette;
image.load("picture_path/name.png"); // 指定圖片所在位置及圖片名
palette.setBrush(this->backgroundRole(),QBrush(image));
widget->setPalette(palette);

這樣就可以在QWidget上新增一張圖片了。但是,我們發現這樣簡單的處理,是有問題的。例如,程式碼剛執行起來,顯示可能是正常的,但當我們改變窗體大小的時候,圖片顯示效果和想象中的開始有些差別了,例如,圖片可能並沒有填充,而是平鋪等等。這種情況,可能是圖片的解析度剛好和窗體預設大小相當,當窗體大小更改後,二者不再相適應所引起的。要解決這個問題,我們需要在窗體大小變更後,獲取窗體大小,並用它將圖片的大小重新設定一次。

基本上有兩種方式來實現這個效果,其一是重新實現resizeEvent(QResizeEvent * event)函式;其二是通過新增事件監視器的方式。

方式一:重新實現resizeEvent

class MyPicture : public QMainWindow
{
    Q_OBJECT
public:
    explicit MyPicture(QWidget * parent = 0) : QWidget(parent)
    {
        widget = new QWidget;
        this->setCentralWidget(widget);
        hboxlayout = new QHBoxLayout(widget);
        setAutoFillBackground(true);
    }
    void
resizeEvent(QResizeEvent *event) { Q_UNUSED(event) QImage image; QPalette palette; image.load("圖片路徑及名稱"); palette.setBrush(this->backgroundRole(), QBrush(image.scaled(this->size())); this->setPalette(palette); } ...... // other operation private: QWidget * widget; QHBoxLayout * hboxlayout; };

方式二:新增事件監視器
假定自定義了一個類class_A,但沒有重寫resizeEvent,我們可以先寫一個簡單的、如下所示的類:

class MyFilterObject : public QObject
{
    Q_OBJECT
public:
    explicit MyFilterObject(QObject * parent = 0) : QObject(parent) {}
    bool eventFilter(QObject * watched, QEvent * event)
    {
        if (QEvent::Resize == event->type())
        {
            QWidget * widget = qobject_cast<QWidget *>(watched);
            QImage image;
            QPalette palette;
            image.load(":/image/test.png");
            palette.setBrush(widget->backgroundRole(), QBrush(image.scaled(widget->size(), Qt::IgnoreAspectRatio, Qt::FastTransformation)));
            widget->setAutoFillBackground(true);
            widget->setPalette(palette);
        }
    }
}

然後在自定義的類class_A的相關函式中新增如下程式碼:

void class_A::foo()
{
    ...
    QWidget * widget = new QWidget;
    MyFilterObject * filter = new MyFilterObject;
    QEvent * event = new QEvent(QEvent::Resize);
    widget->installEventFilter(filter);  // 安裝監視器
    filter->eventFilter(widget, event);
    ...
}

使用二者中的任何一個,再次執行程式,當改變窗體大小時,發現圖片大小隨著窗體的改變而變化了。有一個問題,就是能明顯的感覺到圖片縮放是有延遲的。或許有更好的實現方式,還請知道的小夥伴不吝賜教!在此謝過先(^_^)

相關推薦

QWidget新增圖片使圖片窗體大小

向QWidget中新增圖片有多種方式,其中一種方法如下: // 部分核心程式碼片段 在Qt 5.7中編譯通過 QWidget * widget = new QWidget; widget->setAtuoFillBackground(true); Q

C# 使用 GDI+ 給圖片新增文字使文字自適應矩形區域

需求 分析&思路 具體實現 需求 需求是要做一個編輯文字的頁面。使用者在網頁端寫文字,文字區域是個矩形框,使用者可以通過下方的拖動條調節文字大小。 如下圖: 提交資料的時候前端傳文字區域的左上角和右

.NetCore 使用AppMetricsInfluxDB新增監控資料通過Grafana影象分析

考慮到分散式部署監控環境是所有的請求情況,所以這一塊一般在閘道器GateWay裡面加比較省事,聚合在一起的,如果放在api服務中,如果只有1個還好,一旦部署Node多是很痛苦的事情 這天需要新增的Nuget包如下: 在配置新增 { "Logging": { "LogLevel"

java利用POIExcel(xls)寫入圖片圖片引用超連結

1.maven依賴 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.

Android開啟系統相機連續拍多張圖片得到圖片地址

1、開啟系統相機: Intent intent = new Intent(); intent.putExtra("return-data"

【前端】利用Canvas給圖片新增水印支援拖拽、編輯、與刪除

利用Canvas給圖片新增水印,支援拖拽、編輯、縮放與刪除。 難點一: 如何在偽元素after“刪除按鈕“上新增點選事件。 通過滑鼠點選位置event中offsetX屬性獲得其偏離元素距離,與元素寬度做比較。若大於元素寬度,則點選在了偽元素上,否則點選到正常元

iview 表格插入圖片獲取圖片對應資料

 首先通過attr為標籤新增屬性,屬性值為對應圖片下標index; 然後在on裡邊通過e.target點選事件獲取點中的標籤,然後獲取屬性uid對的值,傳參 { title: '一審修改', key: 'onesh

根據Url非同步下載圖片圖片儲存到本地

public class AsynDownLoagPic extends AsyncTask<String, Void, Bitmap> { URL url = null; Cont

java 線上給word 檔案插入圖片設定圖片大小

一、前言: 有時我們想在一篇word文件中的指定位置新增一張伺服器上的圖片,並且並且設定圖片大小。這個對文件的操作一定是需要第三

MFCpicture控制元件將bitmap根據控制元件大小

直接在OnInitDialog()函式中新增即可; CRect rc; m_ctrlPic.GetClientRect(&rc); CDC* pdcpic = m_ctrlPic.GetDC(); //m_ctrlPic是Picture控制元件的變數

改變MKAnnotationView的大小使MKMapView的

如果要完成如題功能,有一個技術點需要實現。就是如何detect KMapView的pinch事件, iOS中有UIPinchGestureRecognizer,所以我們可以用這個來detect. 首先

一個類新增元素(add)和獲取元素數量(size)方法。 啟動兩個線程。線程1容器新增數據。線程2監聽容器元素數量當容器元素數量為5時線程2輸出信息終止

override tac trace add syn countdown print import 數據 方式一: /** * 兩個線程要是可見的所以要加上votalile */public class Test_01 { public static void

abap選擇螢幕上新增按鈕按鈕上新增文字和圖片新增響應事件

**選擇螢幕SELECTION-SCREEN BEGIN OF BLOCK main WITH FRAME TITLE TEXT-001.PARAMETERS:p_matnr LIKE mara-matnr OBLIGATORY,           p_werks LIKE

在adt-bundle下建立模擬器sdcardsdcard新增影象檔案

參考    http://stephen830.iteye.com/blog/1151368 參考    http://bbs.51cto.com/thread-834350-1.html      

用Ajax請求服務器的圖片顯示在瀏覽器(轉)

時間比較 是否 ktr 而不是 標簽設置 gpo 異常 ping 瀏覽器中 前言 一直在數據庫裏面存的都是圖片在服務器的地址,然後再到瀏覽器中顯示,但是發現兩個問題 第一:為了安全起見,js是無法讀取本地的圖片的,不然你寫一個js,豈不是可以獲取任何人電腦裏面的文件了。 第

html +css 登陸框加用戶圖片設置登陸名不蓋住圖標

png top tle lin 分享圖片 head bubuko 用戶輸入 color 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="

linux系統CentOS7.2安裝ffmpeg擴充套件PHP用FFmpeg擷取視訊第一幀作為視訊封面圖片新增播放視訊按鈕

最近做公司的專案中,有使用者上傳視訊,後臺這邊接收視訊並上傳,獲取視訊第一幀作為視訊封面的功能,在網上查找了好多資料,並且安裝 了ffmpeg-php的PHP擴充套件,由於版本問題,安裝好幾個版本都不成功,最後放棄安裝擴充套件,後來執行程式碼發現不用安裝那個擴充套件也能實現截圖並上傳的功能,所以要擷

前端頁面使用AngularJS框架的情況下如何判斷複選框是否選中以及集合新增和移除id

使用angularJS框架的話都需要引入angular.min.js檔案,這個想必各位大佬都懂得,我就不多說了。 這裡主要說說如何判斷複選框是否選中,以及向集合中新增和移除id。   1、如果判斷複選框被選中呢 一般我們在複選框中都是這樣寫: <td>&

java統計一個類建立物件的個數使物件id遞增---static關鍵字的使用

一、思路 主要處理的問題:統計一個類中建立的物件的個數 1、在類中設定一個static的int變數,每次建立一個物件時,count加1。 staic int count=0; Person(){++count;} 2、 同時要讓物件的id遞增,只需把count加1的結果賦給

Qt小心得之1: QWidget新增Q_OBJECT巨集 setStyleSheet設定了背景顏色不顯示

          QWidget在沒有新增Q_OBJECT巨集,在建構函式裡用setStyleSheet設定了背景顏色,是可以正常顯示,但添加了Q_OBJECT巨集後,QWidget就無法顯示背景色了, 百度了一下,發現了類似問題,說是QWidge