c++ - 在调整大小时保持子类 QWidget 的纵横比

标签 c++ qt qwidget

我正在通过子类化 QWidget 类来创建一个新的小部件。我希望能够为此小部件设置一个比率(针对其高度和宽度),该比率将始终保持不变。

为此,我一直在使用 Qt5 文档、Google 和 Stackoverflow 进行搜索。显然,我找到了答案:特别是 this one .但是,不幸的是,甚至没有一个是完全有效的:

  • 设置 sizeIncrement 完全没有任何作用,即使小部件是一个窗口也是如此
  • 我试图重载 resizeEvent,但我真的不知道该怎么做...
  • 如果我关注 this answer , 两件事:

    1. 如果小部件是顶级窗口,则根本不会保持比例,我可以根据需要调整它的大小。
    2. 如果我将此小部件放置在布局中,如果我只是增加窗口的宽度和高度,则比例保持不变。但是,一旦我将宽度或高度增加很多,小部件就会变平。相反,我希望布局自动调整其大小以保持小部件的比例。

那么,我怎样才能保持子类 QWidget 的纵横比呢?

最佳答案

创建一个用于放置您的小部件的父小部件(例如,AspectRatioWidget)。对于父部件,子类化 QWidget 并给它一个 QBoxLayout。将您的小部件放在中心,并将 QSpacerItems 放在两侧。然后在父小部件的 QWidget::resizeEvent 中调整方向并根据需要进行拉伸(stretch)。我在下面提供了一个例子。要使用,只需创建一个 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);
}

关于c++ - 在调整大小时保持子类 QWidget 的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005540/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 声明 int 数组

c++ - 找不到_BitScanForward64

c++ - '' : free(): invalid pointer 中的突然错误

c++ - 双指针和指针数组的区别

C++ - 更改自定义 QSortFilterProxyModel 的排序

c++ - QSqlQuery 行影响结果

c++ - 从子部件中删除 QGraphicsEffect

c++ - QTest覆盖涂料法

qt - 如何仅查找 Qt Designer 中显示的小部件的属性?