据我所知,在Qt4中,没有一个标志可以让鼠标驱动的窗口大小调整保持一定的纵横比(比如1:1)。有没有办法在"resizeEvent (QResizeEvent * event)“中强制窗口的新大小?该事件的参数似乎不支持更改,也不给用户注入新大小的机会。
我的目标是:GUI/鼠标调整某个窗口的大小将保持其当前的纵横比,而不管您从哪里调整它的大小(边、顶、底、角)。
发布于 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
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);
}发布于 2011-09-01 00:09:06
在线程referenced by @blueskin中引用消息
这是出乎意料的困难。大多数窗口系统不允许应用程序对窗口设置最大和最小大小以外的约束,并且窗口大小可以是固定的。
最常见的尝试方法是从resize事件中调用resize。这通常会导致递归问题,或者看起来很奇怪,因为小部件会以用户未请求的方式调整大小。
由于大多数窗口系统不允许适当地调整主窗口的大小,因此最好的解决方案通常是约束一个子窗口小部件,而不是父窗口小部件。这样做的一种方法是使用libqxt提供的类。
libqxt支持通过其QxtLetterBoxWidget将子窗口小部件保持在特定的纵横比。@blueskin的answer提供了一次很好的尝试来完成最初请求的操作。
如果您感兴趣,我建议您阅读resizeWidget()函数的source,并观察它被调用的位置。作为背景,libqxt使用pimpl习惯用法,qxt_d()获取私有成员。
发布于 2011-09-01 02:16:46
另一种更快更简单的方法是: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();
}https://stackoverflow.com/questions/7259847
复制相似问题