Qt保持Widget比例

进行Ui设计时,若碰到需要保持缩放过程中Widget水平与竖直方向的比例的情况时,本文提供了一个基本的解决方法,将需要保持比例的Widget作为一个容器Widget中的一个子部件,通过重写容器Widget的resizeEvent事件实现比例的保持!

WidgetKeepSubWidgetRadioClass.h

#include <QtCore>
#include <QResizeEvent>
#include <QWidget>
class WidgetKeepSubWidgetRadioClass:public QWidget
{
public:
    WidgetKeepSubWidgetRadioClass();
    ~WidgetKeepSubWidgetRadioClass();
    void setSubWidget(QWidget* pWidget);
    void DisableKeepRadio(void);
    void EnableKeepRadio(float Radio);
private:
    void resizeEvent(QResizeEvent* e);
private:
    bool isKeepRadio = true;
    float SubWidgetRadio = 1;
    QWidget* pSubWidget = nullptr;
};

WidgetKeepSubWidgetRadioClass.cpp

#include "WidgetKeepSubWidgetRadioClass.h"
#include <QHBoxLayout>

WidgetKeepSubWidgetRadioClass::WidgetKeepSubWidgetRadioClass()
{
    this->setStyleSheet("background:#333333");
    QHBoxLayout* pLayout = new QHBoxLayout(this);
    pLayout->setMargin(0);
}

WidgetKeepSubWidgetRadioClass::~WidgetKeepSubWidgetRadioClass()
{
}

void WidgetKeepSubWidgetRadioClass::resizeEvent(QResizeEvent* e)
{
    if (isKeepRadio == false || pSubWidget == nullptr)
        return;
    int InnerWidth = this->width() - (this->layout()->contentsMargins().left() + this->layout()->contentsMargins().right());
    int InnerHeight = this->height() - (this->layout()->contentsMargins().top() + this->layout()->contentsMargins().bottom());

    float WidgetRadio = 1.0*InnerWidth / InnerHeight;
    float ImageRadio = 1.0 * SubWidgetRadio;
    QSize ImageOrigPixel = QSize(this->layout()->contentsMargins().left(), this->layout()->contentsMargins().top()), ImageNewSize = QSize(0, 0);
    if (WidgetRadio > ImageRadio){
        ImageNewSize.setWidth(InnerHeight*ImageRadio);
        ImageNewSize.setHeight(InnerHeight);
        ImageOrigPixel.setWidth(ImageOrigPixel.width() + (InnerWidth - ImageNewSize.width()) / 2);
        ImageOrigPixel.setHeight(ImageOrigPixel.height());
    }
    else{
        ImageNewSize.setWidth(InnerWidth);
        ImageNewSize.setHeight(InnerWidth / ImageRadio);
        ImageOrigPixel.setWidth(ImageOrigPixel.width());
        ImageOrigPixel.setHeight(ImageOrigPixel.height() + (InnerHeight - ImageNewSize.height()) / 2);
    }

    pSubWidget->move(ImageOrigPixel.width(), ImageOrigPixel.height());
    pSubWidget->resize(ImageNewSize.width(), ImageNewSize.height());
}

void WidgetKeepSubWidgetRadioClass::DisableKeepRadio(void)
{
    isKeepRadio = false;
    this->resize(this->size() + QSize(1, 1));
    this->resize(this->size() - QSize(1, 1));
}

void WidgetKeepSubWidgetRadioClass::EnableKeepRadio(float Radio)
{
    isKeepRadio = true;
    SubWidgetRadio = Radio;
    this->resize(this->size() + QSize(1, 1));
    this->resize(this->size() - QSize(1, 1));
}

void WidgetKeepSubWidgetRadioClass::setSubWidget(QWidget* pWidget)
{
    for (int Index = this->layout()->count() - 1; Index >= 0; Index--)
        this->layout()->removeItem(this->layout()->itemAt(Index));
    pSubWidget = pWidget;
    this->layout()->addWidget(pSubWidget);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值