Wie erhalte ich ein Signal, wenn der Fenstermanager die Fenstergröße in qt QML geändert hat?

 C Programming >> C-Programmierung >  >> Tags >> Qt
Wie erhalte ich ein Signal, wenn der Fenstermanager die Fenstergröße in qt QML geändert hat?


Ich versuche, einen ähnlichen Effekt wie der MiniPlayer von iTunes zu erzielen, wenn die Größe unter macOS geändert wird. Das heißt, Erfassen, wann eine Größenänderung des Fensters abgeschlossen ist, DANN Ändern der Höhe auf einen bestimmten Wert. Hier ist ein visuelles Beispiel:



Das Problem besteht darin, dass kein Signal in einem QML-Fenster vorhanden ist, um mich zu benachrichtigen, wenn der Fenstermanager mit der Größenänderung fertig ist (das heißt, der Benutzer hat das Handle losgelassen). Wenn ich also kein Signal habe und meine Höhenänderung anwende, sobald Breite oder Höhe während der Größenänderung geändert werden, flackert das Fenster (doppelte Größenänderung passiert), solange der Benutzer den Griff nicht loslässt.


Vielen Dank für jede Eingabe oder Hilfe!


Antworten:


Sie könnten Ihr eigenes Größenänderungs-Handle ziemlich einfach implementieren, indem Sie eine MouseArea verwenden und die endgültige Größenänderungsberechnung mit onReleased handhaben (hier wird die Höhe auf 75 % der Breite beim Loslassen erzwungen):


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
}
}
}

Einige Code-Antworten


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
}
} }
window.resizeStarted() // hypothetical new event  window.widthChanged() window.heightChanged() window.widthChanged() window.heightChanged() ...  window.resizeEnded()   // hypothetical new event 
//MyWindow.qml Window { signal resizeStarted() signal resizeEnded() }
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 }