我正在创建一个新的小部件,通过继承QWidget类.我希望能够为这个小部件设置一个比例(高度和宽度),它将始终保持不变.
为此,我总是使用Qt5文档,Google和*进行搜索.显然,我已经找到答案:特别是this one.但是,不幸的是,甚至没有一个是完全有效的:
>即使窗口小部件是窗口,设置sizeIncrement也完全没有
>我试图重载resizeEvent,但我真的不知道怎么做…
>如果我遵循this answer,有两件事:
>如果小部件是*窗口,则根本不保持比例,我可以根据需要调整大小.
>如果我将此小部件放置在布局中,如果我只增加窗口的宽度和高度,则保持比率.但是一旦我将宽度或高度增加到很多,小部件就会变平.相反,我希望布局自动调整其大小以保持小部件的比例.
那么,我怎样才能保持子类QWidget的宽高比?
解决方法:
创建一个父窗口小部件(例如,AspectRatioWidget),用于放置窗口小部件.对于父窗口小部件,子类QWidget并给它一个QBoxLayout.将您的小部件放入中心,并在任何一侧放置QSpacerItems.然后在父窗口小部件的QWidget :: resizeEvent中根据需要调整方向和拉伸.我在下面提供了一个例子.要使用,只需创建一个AspectRatioWidget实例,并向构造函数传递一个指向窗口小部件和所需宽高比的指针.
// header
class AspectRatioWidget : public QWidget
{
public:
AspectRatioWidget(QWidget *widget, float width, float height, QWidget *parent = 0);
void resizeEvent(QResizeEvent *event);
private:
QBoxLayout *layout;
float arWidth; // aspect ratio width
float arHeight; // aspect ratio height
};
// cpp
AspectRatioWidget::AspectRatioWidget(QWidget *widget, float width, float height, QWidget *parent) :
QWidget(parent), arWidth(width), arHeight(height)
{
layout = new QBoxLayout(QBoxLayout::LeftToRight, this);
// add spacer, then your widget, then spacer
layout->addItem(new QSpacerItem(0, 0));
layout->addWidget(widget);
layout->addItem(new QSpacerItem(0, 0));
}
void AspectRatioWidget::resizeEvent(QResizeEvent *event)
{
float thisAspectRatio = (float)event->size().width() / event->size().height();
int widgetStretch, outerStretch;
if (thisAspectRatio > (arWidth/arHeight)) // too wide
{
layout->setDirection(QBoxLayout::LeftToRight);
widgetStretch = height() * (arWidth/arHeight); // i.e., my width
outerStretch = (width() - widgetStretch) / 2 + 0.5;
}
else // too tall
{
layout->setDirection(QBoxLayout::TopToBottom);
widgetStretch = width() * (arHeight/arWidth); // i.e., my height
outerStretch = (height() - widgetStretch) / 2 + 0.5;
}
layout->setStretch(0, outerStretch);
layout->setStretch(1, widgetStretch);
layout->setStretch(2, outerStretch);
}