qt 中控件保持比例缩放

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 }
  • 1
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值