调整主窗口大小时强制保持纵横比

5
我知道在Qt4中,没有单个标志可以设置,使鼠标驱动的窗口调整大小保持特定的长宽比(例如1:1)。是否有一种方法可以强制在“resizeEvent(QResizeEvent * event)”时为窗口设置新的大小?事件的参数似乎不支持更改或给用户一个机会注入新的尺寸。
我的目标是:GUI/鼠标调整大小的某个窗口将保持其当前宽高比,无论您从哪里调整它(边缘、顶部、底部、角落)。
3个回答

3

引用@blueskin所提到的主题中的消息:

这其实很难做到。大多数窗口系统不允许应用程序设置窗口的约束条件,除了最大和最小尺寸以及它可以是固定大小。

最常见的尝试方法是在调整大小事件中调用resize。这经常导致递归问题或看起来奇怪,因为小部件以用户未请求的方式调整大小。

由于大多数窗口系统不允许适当调整主窗口的大小,因此最好的解决方案通常是限制子小部件而不是父级。其中一种方法是使用libqxt提供的类。

libqxt通过其QxtLetterBoxWidget支持保持子窗口部件在特定宽高比下的显示。@blueskin的答案提供了一个很好的尝试,以满足最初的要求。

如果您感兴趣,我建议您阅读resizeWidget()函数的源代码并观察调用它的地方。作为背景,libqxt使用pimpl惯用语法,而qxt_d()可以访问私有成员。


为什么需要子窗口?我需要我的主窗口保持纵横比,所有内部小部件都具有拉伸的大小策略,并且可以适应任何大小。问题在于如何限制主框架始终保持其纵横比? - JasonGenX
我已经编辑了我的答案,以澄清为什么通常使用子小部件/布局。 - Kaleb Pederson

2

重复的问题? 如何在Qt中保持小部件的纵横比?

引用上面链接中'df'的答案

在resizeEvent()中调用resize()从来没有很好地工作过 - 最多会导致窗口调整大小两次(正如您所做的那样)闪烁,最坏的情况下是无限循环。

我认为保持固定宽高比的“正确”方法是创建自定义布局。 您将不得不覆盖仅两个方法,QLayoutItem :: hasHeightForWidth()和QLayoutItem :: heightForWidth()。

还可以查看Sam Dutton在此处的解决方案

void MyWindow::resizeEvent(QResizeEvent * /*resizeEvent*/) 
{
    int containerWidth = _myContainerWidget->width();
    int containerHeight = _myContainerWidget->height();

    int contentsHeight = containerHeight ;
    int contentsWidth = containerHeight * _aspectRatio;
    if (contentsWidth > containerWidth ) {
        contentsWidth = containerWidth ;
        contentsHeight = containerWidth / _aspectRatio;
    }

    resizeContents(contentsWidth, contentsHeight);
}

6
不确定为什么我需要处理布局?我只需要主窗口框架保持纵横比即可。内部小部件与主框架的任何大小兼容,因为当我自由调整框架大小时它们会很好地拉伸。 - JasonGenX

1
另外一种快速且更简单的方法是: http://developer.qt.nokia.com/forums/viewthread/5320/#31866
#include <QWidget>
#include <QApplication>
#include <QSizePolicy>

class MyWidget:public QWidget
{
public:
  MyWidget():QWidget(){};
  ~MyWidget(){};
  virtual int heightForWidth ( int w ) const { return w*9/16;};
};

int main (int argv, char** argc)
{
  QApplication a(argv,argc);
  MyWidget w;
  QSizePolicy qsp(QSizePolicy::Preferred,QSizePolicy::Preferred);
  qsp.setHeightForWidth(true);
  w.setSizePolicy(qsp);
  w.show();

  a.exec();
}

我按原样拿了代码,在Mac OSX和Qt 4.7.3下尝试运行它——没有效果。窗口自由调整大小,没有任何限制。 - JasonGenX
heightForWidth 只被布局管理器使用,而非顶层小部件。 - chacham15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接