Открыть выпадающее меню QML ComboBox с текущей позиции элемента

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