2023-05-12 11:46:42 +00:00
|
|
|
import QtQuick 2.15
|
|
|
|
import QtQuick.Controls 2.15
|
|
|
|
import QtQuick.Layouts 1.15
|
|
|
|
import QtQml 2.15
|
|
|
|
|
|
|
|
|
|
|
|
Item {
|
|
|
|
id: root
|
|
|
|
|
|
|
|
readonly property string bugLink:
|
|
|
|
"https://bugreports.qt.io/browse/QTBUG-87804"
|
|
|
|
|
|
|
|
Popup {
|
|
|
|
id: popup
|
|
|
|
|
|
|
|
visible: true
|
|
|
|
|
|
|
|
width: 200
|
|
|
|
|
|
|
|
x: draggableRectangle.width / 2
|
|
|
|
y: draggableRectangle.height / 2
|
|
|
|
|
|
|
|
parent: {
|
|
|
|
anchors.centerIn = undefined
|
|
|
|
Qt.callLater(() => anchors.centerIn = Qt.binding(
|
|
|
|
() => centerInParentCheckBox.checked ? parent
|
|
|
|
: undefined))
|
|
|
|
if (pageRootRadioButton.checked)
|
|
|
|
return root
|
|
|
|
|
|
|
|
if (overlayRadioButton.checked)
|
|
|
|
return Overlay.overlay
|
|
|
|
|
|
|
|
return draggableRectangle
|
|
|
|
}
|
|
|
|
|
|
|
|
closePolicy: Popup.NoAutoClose
|
|
|
|
|
|
|
|
margins: marginsSlider.value
|
|
|
|
|
|
|
|
background: Rectangle {
|
|
|
|
border.color: "black"
|
|
|
|
}
|
|
|
|
|
|
|
|
Binding on margins{
|
|
|
|
id: workaroundBinding
|
|
|
|
|
|
|
|
when: false
|
|
|
|
}
|
|
|
|
|
2023-08-03 10:36:51 +00:00
|
|
|
onImplicitContentHeightChanged: {
|
|
|
|
if (!workAroundCheckBox.checked)
|
|
|
|
return
|
|
|
|
|
|
|
|
workaroundBinding.value = popup.margins + 1
|
|
|
|
workaroundBinding.when = true
|
|
|
|
workaroundBinding.when = false
|
|
|
|
}
|
|
|
|
|
2023-05-12 11:46:42 +00:00
|
|
|
ColumnLayout {
|
|
|
|
Button {
|
|
|
|
text: "Some button 1"
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
}
|
|
|
|
Button {
|
|
|
|
text: "Some button 2"
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
}
|
|
|
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
|
|
ListView {
|
|
|
|
id: listView
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.fillHeight: true
|
|
|
|
Layout.preferredHeight: contentHeight
|
|
|
|
|
|
|
|
model: itemsCountSlider.value
|
|
|
|
spacing: 2
|
|
|
|
clip: true
|
|
|
|
|
|
|
|
delegate: Rectangle {
|
|
|
|
width: popup.availableWidth
|
|
|
|
color: "lightblue"
|
|
|
|
border.color: "black"
|
|
|
|
height: 20
|
|
|
|
|
|
|
|
Label {
|
|
|
|
text: index
|
|
|
|
anchors.centerIn: parent
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "Some button 3"
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
id: draggableRectangle
|
|
|
|
|
|
|
|
visible: draggableRadioButton.checked
|
|
|
|
|
|
|
|
border.color: "green"
|
|
|
|
color: "lightgreen"
|
|
|
|
border.width: 3
|
|
|
|
|
|
|
|
width: 50
|
|
|
|
height: width
|
|
|
|
x: 100
|
|
|
|
y: 100
|
|
|
|
radius: width / 2
|
|
|
|
|
|
|
|
Drag.active: dragArea.drag.active
|
|
|
|
|
|
|
|
MouseArea {
|
|
|
|
id: dragArea
|
|
|
|
|
|
|
|
anchors.fill: parent
|
|
|
|
drag.target: parent
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Pane {
|
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
RowLayout {
|
|
|
|
Label {
|
|
|
|
text: "items count:"
|
|
|
|
}
|
|
|
|
|
|
|
|
Slider {
|
|
|
|
id: itemsCountSlider
|
|
|
|
|
|
|
|
from: 5
|
|
|
|
to: 100
|
|
|
|
stepSize: 1
|
|
|
|
|
|
|
|
value: 10
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
|
|
|
text: `(${itemsCountSlider.value})`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RowLayout {
|
|
|
|
Label {
|
|
|
|
text: "margins:"
|
|
|
|
}
|
|
|
|
|
|
|
|
Slider {
|
|
|
|
id: marginsSlider
|
|
|
|
|
|
|
|
from: -1
|
|
|
|
to: 100
|
|
|
|
stepSize: 1
|
|
|
|
|
|
|
|
value: 10
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
|
|
|
text: `(${marginsSlider.value})`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CheckBox {
|
|
|
|
id: centerInParentCheckBox
|
|
|
|
|
|
|
|
checked: true
|
|
|
|
text: "Center in parent"
|
|
|
|
}
|
|
|
|
|
|
|
|
CheckBox {
|
|
|
|
id: workAroundCheckBox
|
|
|
|
|
|
|
|
checked: true
|
|
|
|
text: "Use workaround for " +
|
|
|
|
`<a href="${bugLink}">${bugLink}</a>` +
|
|
|
|
" (not needed in Qt 6)"
|
|
|
|
|
|
|
|
contentItem: Label {
|
|
|
|
text: parent.text
|
|
|
|
font: parent.font
|
|
|
|
verticalAlignment: Text.AlignVCenter
|
|
|
|
leftPadding: parent.indicator.width + parent.spacing
|
|
|
|
|
|
|
|
onLinkActivated: Qt.openUrlExternally(link)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RowLayout {
|
|
|
|
Label {
|
|
|
|
text: "parent:"
|
|
|
|
}
|
|
|
|
|
|
|
|
RadioButton {
|
|
|
|
id: pageRootRadioButton
|
|
|
|
|
|
|
|
text: "page root"
|
|
|
|
checked: true
|
|
|
|
}
|
|
|
|
|
|
|
|
RadioButton {
|
|
|
|
id: overlayRadioButton
|
|
|
|
|
|
|
|
text: "overlay"
|
|
|
|
}
|
|
|
|
|
|
|
|
RadioButton {
|
|
|
|
id: draggableRadioButton
|
|
|
|
|
|
|
|
text: "draggable item"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Pane {
|
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.right: parent.right
|
|
|
|
|
|
|
|
z: -1
|
|
|
|
|
|
|
|
Label {
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
|
|
wrapMode: Text.Wrap
|
|
|
|
|
|
|
|
textFormat: Text.MarkdownText
|
|
|
|
text: `Conclusions:
|
|
|
|
|
|
|
|
* When component size depends on both content and screen position, it is
|
|
|
|
important to set both **Layout.fillHeight: true** and
|
|
|
|
**Layout.preferredHeight** for a variable height component.
|
|
|
|
* There is a bug in Qt causing the default height calculation mechanism doesn't
|
|
|
|
work properly in Qt 5.15 (it's ok in Qt 6). The proposed solution works
|
|
|
|
transparently and does not change other aspects of behavior.
|
|
|
|
* The value **margins: -1** has a special meaning and changes the behavior of
|
|
|
|
the popup when **anchors.centerIn** is not used. Causes the popup to never be
|
|
|
|
positioned higher than the given position, regardless of the amount of space
|
|
|
|
available (probably undesirable behavior in most cases).
|
|
|
|
`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-07-31 12:21:14 +00:00
|
|
|
|
|
|
|
// category: Research / Examples
|