項目中涉及到視頻窗口的顯示,而視頻窗口在縮放的過程中,肯定需要保持寬高比進行縮放,然而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 }