#qt #qml #qtquickcontrols2
#qt #qml #qtquickcontrols2
Вопрос:
Я должен выбрать элемент в combobox. Например, позиция элемента равна 300. Если я хочу выбрать новый элемент из выпадающего списка. Всплывающее окно отображается с самого начала. Я хочу, чтобы всплывающее окно открывалось из текущей позиции элемента.
ComboBox {
id: control
model: ["First", "Second", "Third","MERHABA","NASILSIN","SELAM","IYIMISIN","DOSTUM","SUAN","BIR","DENEME YAPILIYOR"]
//width: 350
//font.pixelSize: 20
delegate: ItemDelegate {
width: 350
text: modelData
font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
font.pixelSize: 30
highlighted: control.highlightedIndex == index
}
Комментарии:
1. Это была ошибка, которая была исправлена в Qt 5.7.1: bugreports.qt.io/browse/QTBUG-55030
2. Вы пробовали использовать Qt 5.7.1 или 5.8.0?
Ответ №1:
Для QtQuick.В элементах управления 2 есть свойство ‘popup’, поэтому мы можем задать позицию всплывающего окна с помощью его собственного свойства ‘y’, вот так:
ComboBox {
model: ["First", "Second", "Third"]
delegate: ItemDelegate {
text: modelData
}
popup.y: y height // popup just below ComboBox
}
Ответ №2:
ComboBox
Будет работать так, как вы хотите, если это позволяют условия, то есть, если у вас достаточно элементов, чтобы заполнить весь выпадающий список после текущего элемента индекса, он будет отображаться с этого элемента, а не с начала.
Однако, похоже, что stock ComboBox
не позволяет вам указывать высоту выпадающего списка, поэтому потребуется значительно больше элементов, чем у вас в вашем примере. Или элементы значительно выше.
Кроме того, если текущий индекс является последним элементом, как, по вашему мнению, это будет отображаться? В списке будет отображаться только последний элемент плюс целая куча ничего, что даже невозможно, последний элемент не может переместиться вверх из конца списка.
Если вы действительно хотите такого поведения, вам придется реализовать свой собственный элемент поля со списком с нуля.
Ответ №3:
Я столкнулся с той же проблемой и обнаружил, что если вы разместите всплывающее окно onOpened, оно будет работать отлично:
ComboBox {
id: yearDropdown
model: yearModel
onActivated: updateVisibleDate()
popup: Popup {
id: comboPopup
clip: true
contentItem: ListView {
id: listView
implicitHeight: contentHeight
model: yearDropdown.popup.visible ? yearDropdown.delegateModel : null
onModelChanged: if(model) positionViewAtIndex(yearDropdown.currentIndex, ListView.Center);
ScrollIndicator.vertical: ScrollIndicator { }
}
onOpened: {
x = yearDropdown.x //Set the position you want
y = yearDropdown.y yearDropdown.implicitHeight //Set the position you want
}
}
}