这里是我的测试代码:如何在强制固定宽高比时停止窗口大小跳动?
import QtQuick 2.4
import QtQuick.Window 2.2
Window {
visible: true
readonly property int defaultWidth: 700
readonly property int defaultHeight: 500
width: defaultWidth
height: defaultHeight
readonly property real aspectRatio: defaultWidth/defaultHeight
readonly property real scaleFactor: width/defaultWidth
onWidthChanged: {
var properHeight = Math.round(width/aspectRatio);
if (height !== properHeight) {
height = properHeight
}
}
onHeightChanged: {
var properWidth = Math.round(height * aspectRatio);
if (width !== properWidth) {
width = properWidth
}
}
TextEdit {
id: textEdit
text: "Lorem ipsum"
font.pixelSize: 40 * scaleFactor
anchors.fill: parent
}
}
它实现固定纵横比,但它并不能很好地工作:有几分固定纵横比的大小和鼠标器之间闪烁(窗口大小的跳跃调整后的大小),并且可以根据宽度和高度变化事件的顺序来调整错误的尺寸。实际上,当以编程方式调整大小时,窗口边缘可能会在鼠标光标位置和编程设置的不同位置之间开始跳转。
什么应该发生时,它被拖动应遵循的鼠标光标(如在任何大小调整)的窗口边缘,而另一个边缘应改变,以保持高宽比:
- 如果用户拖动左/右边缘,底部边缘应移动以保持宽高比。
- 如果用户拖动上/下边缘,则右边缘也应移动以保持宽高比。
- 当用户拖动一个角落里,有两种可能的大小取,以保持高宽比,如高度或宽度可以被编程改变。如何确定这一点并不重要,只要它是一致的即可。
- 没问题,如果宽高比只有在调整大小停止后才固定,但实时会更好。但如何可靠地检测调整大小实际上停止?
- 如果不能使用Qt独自完成,我感兴趣的是Windows和X11/Linux的具体解决方案。
如何实现调整大小,同时保留长宽比,使用本机窗口调整控件(正常窗口边框或任何平台使用),这样它的行为逻辑和看起来不错?
编辑,“提示”:我有时间做一些研究,覆盖QQuickView::resizeEvent
并呼吁resize
从那里似乎是能够做的伎俩,但我没有时间去得到它的工作非常正确。
感谢您的想法。我想我会保持框架,但我可能会做类似于你的事情:不允许正常调整大小,并且只是具有可切换的“正常大小”和“最大化大小”,而不是我自己调整大小的句柄。不过,我希望有人用完整的解决方案来回答。 – hyde
唉,过滤掉resize事件不会阻止窗口调整大小,因为我认为它会。 – dtech
看起来您可以通过设置最大和最小高度和宽度来停止调整大小,以仅允许一个大小。 – hyde