我知道在Qt4中,没有单个标志可以设置,使鼠标驱动的窗口调整大小保持特定的长宽比(例如1:1)。是否有一种方法可以强制在“resizeEvent(QResizeEvent * event)”时为窗口设置新的大小?事件的参数似乎不支持更改或给用户一个机会注入新的尺寸。
我的目标是:GUI/鼠标调整大小的某个窗口将保持其当前宽高比,无论您从哪里调整它(边缘、顶部、底部、角落)。
我的目标是:GUI/鼠标调整大小的某个窗口将保持其当前宽高比,无论您从哪里调整它(边缘、顶部、底部、角落)。
引用@blueskin所提到的主题中的消息:
这其实很难做到。大多数窗口系统不允许应用程序设置窗口的约束条件,除了最大和最小尺寸以及它可以是固定大小。
最常见的尝试方法是在调整大小事件中调用resize。这经常导致递归问题或看起来奇怪,因为小部件以用户未请求的方式调整大小。
由于大多数窗口系统不允许适当调整主窗口的大小,因此最好的解决方案通常是限制子小部件而不是父级。其中一种方法是使用libqxt提供的类。
libqxt通过其QxtLetterBoxWidget支持保持子窗口部件在特定宽高比下的显示。@blueskin的答案提供了一个很好的尝试,以满足最初的要求。
如果您感兴趣,我建议您阅读resizeWidget()
函数的源代码并观察调用它的地方。作为背景,libqxt使用pimpl惯用语法,而qxt_d()
可以访问私有成员。
重复的问题? 如何在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);
}
#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();
}