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

时间:2011-08-31 15:58:41

标签: qt

据我所知,在Qt4中,没有一个标志可以设置为鼠标驱动窗口大小调整保持一定的宽高比(比如1:1)。在“resizeEvent(QResizeEvent * event)”中有没有办法强制窗口的新大小?事件的参数似乎不支持更改或让用户有机会注入新的大小。

我的目标:GUI /鼠标调整某个窗口的大小将保持其当前的宽高比,无论您从哪里调整大小(侧面,顶部,底部,角落)。

3 个答案:

答案 0 :(得分:3)

在帖子referenced by @blueskin中引用消息:

  

这令人惊讶地难以做到。大多数窗户系统没有   允许应用程序在窗口以外设置约束   最大和最小尺寸,它可以是固定尺寸。

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

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

libqxt支持通过QxtLetterBoxWidget将子窗口小部件保持在特定宽高比。 @ blueskin的answer提供了一个很好的尝试,可以做最初的请求。

如果您有兴趣,我建议您阅读resizeWidget() qxt_d()函数,并观察它被调用的位置。作为背景,libqxt使用source成语,{{1}}获取私有成员。

答案 1 :(得分:2)

重复问题? How to maintain widgets aspect ratio in Qt?

  

在上面的链接中用“df”引用答案

     

从resizeEvent()中调用resize()从来没有奏效过   我 - 最好它会导致闪烁,因为窗口调整了两次   (正如你所知),最糟糕的是无限循环。

     

我认为保持固定宽高比的“正确”方法是   创建自定义布局。你只需要覆盖两种方法,   QLayoutItem :: hasHeightForWidth()和QLayoutItem :: heightForWidth()。

同时查看Sam Dutton的解决方案@ http://lists.trolltech.com/qt-interest/2007-01/msg00204.html

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

答案 2 :(得分:2)

另一种快速简单的方法: 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();
}