首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整主窗口大小时强制设置纵横比

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

Stack Overflow用户
提问于 2011-08-31 23:58:41
回答 3查看 15.4K关注 0票数 5

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

我的目标是:GUI/鼠标调整某个窗口的大小将保持其当前的纵横比,而不管您从哪里调整它的大小(边、顶、底、角)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-01 00:06:02

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

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

在resizeEvent()中调用resize()对我来说从来都不能很好地工作--在最好的情况下,它会导致窗口闪烁,因为窗口被调整了两次(就像您所做的那样),最坏的情况是无限循环。

我认为保持固定纵横比的“正确”方法是创建自定义布局。您只需覆盖两个方法: QLayoutItem::hasHeightForWidth()和QLayoutItem::heightForWidth()。

也可以查看Sam Dutton的solution @ http://lists.trolltech.com/qt-interest/2007-01/msg00204.html

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-09-01 00:09:06

在线程referenced by @blueskin中引用消息

这是出乎意料的困难。大多数窗口系统不允许应用程序对窗口设置最大和最小大小以外的约束,并且窗口大小可以是固定的。

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

由于大多数窗口系统不允许适当地调整主窗口的大小,因此最好的解决方案通常是约束一个子窗口小部件,而不是父窗口小部件。这样做的一种方法是使用libqxt提供的类。

libqxt支持通过其QxtLetterBoxWidget将子窗口小部件保持在特定的纵横比。@blueskin的answer提供了一次很好的尝试来完成最初请求的操作。

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

票数 3
EN

Stack Overflow用户

发布于 2011-09-01 02:16:46

另一种更快更简单的方法是:http://developer.qt.nokia.com/forums/viewthread/5320/#31866

代码语言:javascript
复制
#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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7259847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档