我正在创建一个新的小部件,通过继承 QWidget 类。我希望能够为这个小部件设置一个比率(对于它的高度和宽度),该比率将始终保持不变。

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

  • 设置 sizeIncrement 完全没有作用,即使小部件是一个窗口
  • 我试图重载resizeEvent,但我真的不知道该怎么做...
  • 如果我遵循 this answer ,有两件事:
  • 如果widget是顶级窗口,比例根本不保持,我可以根据需要调整它的大小。
  • 如果我把这个小部件放在一个布局中,如果我只是增加窗口的宽度和高度,比例就会保持不变。但是一旦我将宽度或高度增加到很多,小部件就会变平。相反,我希望布局自动调整其大小以保持小部件的比例。

  • 那么,我如何才能保持子类 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/

    10-15 01:38