Qt中控件保持比例縮放


項目中涉及到視頻窗口的顯示,而視頻窗口在縮放的過程中,肯定需要保持寬高比進行縮放,然而qt中並沒有現成的工具可以使用,網上也沒有找到比較好的教程,於是自己探索后記錄下來

最終效果

實現思路是這樣的:

封裝一個類,集成自QFrame(繼承自QFrame而不是QWidget是因為QFrame重載了paintEvent,方便進行樣式美化),在這個類中聲明一個QWidget的成員變量,重寫派生類的這個方法:

    virtual void resizeEvent(QResizeEvent *event);

在這個方法中,自己針對窗口尺寸改變,自行計算子widget的尺寸及位置。

再添加一個get方法,獲取成員變量的指針(或者直接把成員變量聲明為公有)。

使用時,將派生類放到布局中,在將要顯示的內容放到widget里即可。

代碼:

 1 #ifndef KEEPRATIOWIDGET_H
 2 #define KEEPRATIOWIDGET_H
 3 
 4 #include <QFrame>
 5 
 6 class KeepRatioWidget : public QFrame
 7 {
 8     Q_OBJECT
 9 
10 public:
11     KeepRatioWidget(QWidget *parent = 0);
12 
13     void setRatio(int width, int height);
14     QWidget* widget();
15 
16 protected:
17     virtual void resizeEvent(QResizeEvent *event);
18 
19 private:
20     int width_ratio_;
21     int height_ratio_;
22     QWidget* center_widget_;
23 };
24 
25 #endif

 

 1 #include <QResizeEvent>
 2 #include "keepratiowidget.h"
 3 
 4 KeepRatioWidget::KeepRatioWidget(QWidget *parent) :
 5     QFrame(parent)
 6    , width_ratio_(0)
 7    , height_ratio_(0)
 8 {
 9     center_widget_ = new QWidget(this);
10     center_widget_->setStyleSheet("background-color:black;");
11 }
12 
13 void KeepRatioWidget::setRatio(int width, int height)
14 {
15     width_ratio_ = width;
16     height_ratio_ = height;
17 }
18 
19 QWidget *KeepRatioWidget::widget()
20 {
21     return center_widget_;
22 }
23 
24 void KeepRatioWidget::resizeEvent(QResizeEvent *event)
25 {
26     QSize old_size = event->size();
27 QSize new_size = event->size(); 28 29 if(new_size.width()<width_ratio_*new_size.height()/height_ratio_){ 30 //寬度不足,則以寬度來計算 31 new_size.setHeight(height_ratio_ * new_size.width() / width_ratio_); 32 //豎直方向居中 33 center_widget_->move(0,(old_size.height()-new_size.height())/2); 34 } 35 else { 36 //否則以高度來計算 37 new_size.setWidth(width_ratio_ * new_size.height() / height_ratio_); 38 //水平方向居中 39 center_widget_->move((old_size.width()-new_size.width())/2,0); 40 } 41 42 center_widget_->resize(new_size); 43 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM