2016-10-24 2 views
0

У меня есть ComboBox в QML, который содержит более 2000 элементов. Слишком много элементов для прокрутки до последнего элемента. Как добавить добавить фильтр поиска для ComboBox? Когда я набираю буквы, результаты сопоставления должны отображаться в списке. В качестве альтернативы, могу ли я увеличить скорость колеса мыши, чтобы ускорить прокрутку?Как добавить фильтр поиска в ComboBox

Я НАШЕЛ РЕШЕНИЕ LIKE:

ComboBox { 
       id:trCombo 
       model:combotr.datalist 
       textRole: "value" 
       anchors.fill: parent 
       currentIndex:-1; 



       contentItem: Text { 
        leftPadding: 0 
        rightPadding: trCombo.indicator.width + trCombo.spacing 

        text:trCombo.currentIndex==-1 ? "":trCombo.model[trCombo.currentIndex].value 
        font: trCombo.font 
        horizontalAlignment: Text.AlignLeft 
        verticalAlignment: Text.AlignVCenter 
        elide: Text.ElideRight 
       } 

       popup: T.Popup { 
        id:mpopup 
        y: trCombo.height - (trCombo.visualFocus ? 0 : 1) 

        width: trCombo.width 
        implicitHeight: listview.contentHeight 
        topMargin: 6 
        bottomMargin: 6 

       // focus: true 
        closePolicy: Popup.NoAutoClose 

        contentItem: Item { 


         Column 
         { 
         anchors.fill: parent 
         spacing: 5 
         TextField 
         { 

         placeholderText: "arama yapın" 
         width: trCombo.width 
         height: dp(35) 
        // color: "red" 
         focus:true 
         inputMethodHints: Qt.ImhNoPredictiveText; 

         onTextChanged:{ 
          //console.log("degisiyor"); 
          process.filtertr(text); 
         } 

         onAccepted:{ 
         // console.log("Tasarım Bitti"); 
          isfinished(true); 
         // text=""; 


         } 




         } 

         ListView { 
         id: listview 
         clip: true 
         model: trCombo.popup.visible ? trCombo.delegateModel : null 
         currentIndex: trCombo.highlightedIndex 
         width: trCombo.width 
         height:dp(500) 


         Rectangle { 



          z: 10 
          parent: listview 
          width: listview.width 
          height: listview.height 
          color: "transparent" 
          border.color: "#bdbebf" 
          layer.smooth: true 
         } 

         ScrollIndicator.vertical: ScrollIndicator { } 
        } 

        } 
       } 

        background: Rectangle { } 

        onClosed: { 
        if(!flag) 
        { 
         mpopup.open(); 
        } 

        else 
        flag=false; 
        } 


       } 


       delegate: ItemDelegate { 
        width: trCombo.width 
        text: trCombo.textRole ? (Array.isArray(trCombo.model) ? modelData[trCombo.textRole] : model[trCombo.textRole]) : modelData 
        font.weight: trCombo.currentIndex === index ? Font.DemiBold : Font.Normal 
        highlighted: trCombo.highlightedIndex == index 

        onClicked: { 
         isfinished(true); 
        } 
       } 



       onCurrentIndexChanged: { 

        if(currentIndex!=-1) 
        { 
         var sqlid=model[currentIndex].sqlid; 
         combotr.getsqlid(sqlid,1,Query.SelectSubParam,Query.Subq,"TRC",1); 
         TaskResult.taskresult.HatBilgisi_TR=sqlid ; 
         trsCombo.enabled=true; 


        } 

        else 
         trsCombo.enabled=false; 

        trsCombo.currentIndex=-1; 
       } 


     } 
+0

'QtQuick.Controls 1' или' QtQuick.Controls 2'? – Mitch

+0

Комбобокс с элементами 2000 близок к бесполезным. Вы хотите редактировать строку с помощью дополнения. (Я понятия не имею, есть ли у Qt Quick Controls что-то подобное). – peppe

+0

@Mitch, я использую QtQuick.Controls 2 –

ответ

0

я столкнулся с совершенно аналогичной проблемой, однако я имел ListView и Textbox должно быть applyable к вашей проблеме.

Во-первых нет (легко) Возможность фильтровать модели в QML, но я подбежала проект, который решает эту проблему: (QML)SortFilterProxyModel

Боюсь, я не могу попробовать его в данный момент, но вы могли бы использовать эту модель в качестве следует:

import SortFilterProxyModel 0.1 

ComboBox { 
    textRole: "value" 
    model: SortFilterProxyModel { 
     id: filteredModel 
     sourceModel: selectionDialog.model 
     filterRoleName: parent.textRole 
     filterPattern: parent.text // not pretty shure if this is correct, 
     // sorry I currently cannot test it, use the inserted Text of the Combobox 
     filterCaseSensitivity: Qt.CaseInsensitive 
    } 
} 

Я надеюсь, что это вам поможет. Не стесняйтесь спрашивать, есть ли что-то непонятное.

+0

SortFilterProxyModel принадлежит вам или QT –

+0

Это модель от Qt с хорошим QML-интерфейсом. Я не моя работа, которую я только нашел, использовал ее для моего проекта и полюбил интерфейс, потому что я думаю, что это что-то не хватает в QML-World. –

Смежные вопросы