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 }
posted @ 2019-12-17 09:37  0小野人0  阅读(4913)  评论(0编辑  收藏  举报