据我所知,在Qt4中,没有一个标志可以设置为鼠标驱动窗口大小调整保持一定的宽高比(比如1:1)。在“resizeEvent(QResizeEvent * event)”中有没有办法强制窗口的新大小?事件的参数似乎不支持更改或让用户有机会注入新的大小。
我的目标:GUI /鼠标调整某个窗口的大小将保持其当前的宽高比,无论您从哪里调整大小(侧面,顶部,底部,角落)。
答案 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();
}