你可以使用MouseArea轻松实现自己的调整大小手柄,并使用onReleased处理最终的调整大小计算(这里在释放时强制高度为宽度的75%):
Window {
id: window
flags: Qt.FramelessWindowHint
visible: true
height: 300
width: 400
MouseArea {
id: resize
anchors {
right: parent.right
bottom: parent.bottom
}
width: 15
height: 15
cursorShape: Qt.SizeFDiagCursor
property point clickPos: "1,1"
onPressed: {
resize.clickPos = Qt.point(mouse.x,mouse.y)
}
onPositionChanged: {
var delta = Qt.point(mouse.x-resize.clickPos.x, mouse.y-resize.clickPos.y)
window.width += delta.x;
window.height += delta.y;
}
onReleased: {
window.height = .75 * window.width
}
Rectangle {
id: resizeHint
color: "red"
anchors.fill: resize
}
}
}
QML提供了一些NOTIFY信号,当属性值需要更新时使用。因此您可以使用Window.width
和Window.height
:
Window {
id: window
onWidthChanged: {
// Will be executed after window.width value changes.
}
onHeightChanged: {
// Will be executed after window.height value changes.
}
// Other window-related stuff
}
这里有一个想法(我还没有尝试过,但仍然):
实现一个事件处理程序来响应全局光标位置的变化。窗口内的光标位置不适用于调整大小句柄时,因为光标在抓取调整大小句柄时位于窗口外部。不确定是否可能以及如何实现这样的事件处理程序,但至少可以在Qt中访问屏幕全局光标位置。
在事件处理程序中,检查与上次调用处理程序相比的垂直光标位置变化是否与窗口高度变化相同。
您可能需要克服几个问题,例如(1)允许窗口高度和光标y位置变化之间的一定差异,因为窗口高度变化可能不太频繁并且在某种程度上追踪光标移动,(2)仅在窗口调整大小期间启用光标位置事件处理程序以限制系统负载。但如果它起作用,那么它是一种本地解决方案,不需要实现自己的调整大小句柄。
window.resizeStarted() // hypothetical new event
window.widthChanged()
window.heightChanged()
window.widthChanged()
window.heightChanged()
...
window.resizeEnded() // hypothetical new event
这在Qt中似乎是不可能的,但您可以使用以下方法自己实现,最初意味着在调整大小时根本不重新绘制窗口:
过滤相关事件,直到鼠标按钮被释放。具体来说,在鼠标按下时“吃掉”调整大小事件,然后在鼠标释放时合成最终的调整大小事件。您可以在附加到显示QML界面的窗口/小部件对象的事件过滤器中完成所有操作。(source)
该过程与引用中的过程非常相似:
使用自定义信号扩展 QML 窗口类型:
//MyWindow.qml
Window {
signal resizeStarted()
signal resizeEnded()
}
在 QML 窗口上创建一个事件过滤器,以“吃掉”所有窗口调整大小事件。当它遇到第一个事件时,它会发送 resizeStarted()
信号。然后它会转发窗口调整大小事件。当它在调整大小时遇到鼠标释放事件时,在最后一个 widthChanged()
/ heightChanged()
事件之后发送 resizeEnded()
信号。
在 QML 中实现相应的信号处理程序 onResizeEnded
来适应您的应用程序窗口高度到某个固定值。
对我来说似乎是一个相当有前途的路线,但需要注意的是,到目前为止我还没有在代码中尝试过它。