Hello. You need to set currentIndex after your model data initialized, not object. You can initialize at onCountChanged or make special signal from signal and listen it.

09.09.2014 19:07, François K. пишет:
Hi :)

I have a ComboBox issue !

The ComboBox I want to use is made of dynamic items. I build it with a 
ListModel and a Repeater as follow :

ComboBox {
     id: project

     label: qsTr("Project")
     menu: ContextMenu {
         MenuItem { text: qsTr("Not set") }

         Repeater {
             model: ProjectsModel { id: projects }
             delegate: MenuItem { text: model.value }
         }
     }
}

It works pretty well (yay QML !).

Now I would like to initialize the ComboBox value. I tried several things (see 
after) and none of them worked.
I hope you guys can give me some help/tip :)



1. First I tried to set its value directly. It doesn't really work well :

   * The text that appears is the good one - OK
   * When I open the ComboBox to chose another value, the highlighted item is 
not the good one (which means that the ComboBox doesn't compute currentIndex 
and currentItem automagically when one set the ComboBox value) ;
   * Moreover, when I select another item in the menu, the currentIndex and 
currentItem are changed as expected, but the value of the ComboBox doesn't 
change.

Here is the code that highlights the problem :

ComboBox {
     id: project

     label: qsTr("Project")
     menu: ContextMenu {
         MenuItem { text: qsTr("Not set") }
Repeater {
             model: ProjectsModel { id: projects }
             delegate: MenuItem { text: model.value }
         }
     }

     value: "Some Value"

     onCurrentIndexChanged: {
         console.log("currentIndex just changed to : ", currentIndex);
     }

     onCurrentItemChanged: {
         console.log("currentItem just changed to : ", currentItem.text);
     }

     onValueChanged: {
         console.log("value just changed to : ", value);
     }
}

And the output :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2

What I expected to see :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onValueChanged:159 - value just changed to : Bar



2. Then I tried to set currentIndex. There, for some reason that I don't explain, it 
seems that the ComboBox always "resets" :

Component {

     // Some other stuff here

     ComboBox {
         id: project

         label: qsTr("Project")
         menu: ContextMenu {
             MenuItem { text: qsTr("Not set") }

             Repeater {
                 model: ProjectsModel { id: projects }
                 delegate: MenuItem { text: model.value }
             }
         }

         onCurrentIndexChanged: {
             console.log("currentIndex just changed to : ", currentIndex);
         }

         onCurrentItemChanged: {
             console.log("currentItem just changed to : ", currentItem.text);
         }

         onValueChanged: {
             console.log("value just changed to : ", value);
         }
     }

     Component.onCompleted: {
         // Here I get the task object from the database.
         var task = Storage.getTask(id);

         if(task !== null)
         {
             for(var i=0 ; i<projects.count ; i++)
             {
                 if(task.project === projects.get(i).value)
                 {
                     project.currentIndex = i + 1; // We have to +1 because of the 
<Not set> MenuItem.
                     break;
                 }
             }
         }
     }
}

And the output :

[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 0


I also noticed that, in this case, it reverts to 0 because I have a hardcoded 
MenuItem at index 0.
If I remove the first hardcoded "Not set" MenuItem, ComboBox.currentIndex 
reverts to -1.
If I have only hardcoded MenuItems, it works as expected.



By the way, I think it could be great for the ComboBox to behave like HTML’s 
<select> :
MenuItem could have a text and a value property. Setting a ComboBox value would 
automatically update currentItem and currentIndex.
Something like this :

ComboBox {
     menu: ContextMenu {
         MenuItem {
             text: qsTr("Some item")
             value: "some_item"
         }
         MenuItem {
             text: qsTr("Another item")
             value: "another_item"
         }
     }

     Component.onCompleted: {
         value = "another_item"; // This would highlight the second item, set 
currentIndex to 1 and currentItem accordingly.
     }
}

Of course, one could still set currentIndex or currentItem, and it would update 
everything accordingly.

I'd be glad to work on this if you agree :)


Thanks for your attention.

My best wishes,


_______________________________________________
SailfishOS.org Devel mailing list
To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org

Reply via email to