进行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);
}