Qt中控件保持比例缩放
项目中涉及到视频窗口的显示,而视频窗口在缩放的过程中,肯定需要保持宽高比进行缩放,然而qt中并没有现成的工具可以使用,网上也没有找到比较好的教程,于是自己探索后记录下来
最终效果
实现思路是这样的:
封装一个类,集成自QFrame(继承自QFrame而不是QWidget是因为QFrame重载了paintEvent,方便进行样式美化),在这个类中声明一个QWidget的成员变量,重写派生类的这个方法:
virtual void resizeEvent(QResizeEvent *event);
在这个方法中,自己针对窗口尺寸改变,自行计算子widget的尺寸及位置。
再添加一个get方法,获取成员变量的指针(或者直接把成员变量声明为公有)。
使用时,将派生类放到布局中,在将要显示的内容放到widget里即可。
代码:
#ifndef KEEPRATIOWIDGET_H
#define KEEPRATIOWIDGET_H
#include <QFrame>
class KeepRatioWidget : public QFrame
{
Q_OBJECT
public:
KeepRatioWidget(QWidget *parent = 0);
void setRatio(int width, int height);
QWidget* widget();
protected:
virtual void resizeEvent(QResizeEvent *event);
private:
int width_ratio_;
int height_ratio_;
QWidget* center_widget_;
};
#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 }