DE
5 июня 2019 г. 1:48

При выборе элеметна на ListView список пролистывается в конец.

Qt, QML, SQL

Приложение для работы с БД.
Для отображения части информации используется ScrollView{ListView{}}. В качастве делегата используется DelegateModel.

  1. DelegateModel{
  2. id: visualModel
  3. model: elemModel
  4. groups: [ DelegateModelGroup{ name: "selected" } ]
  5.  
  6. function itemsInSelected(){
  7. filterOnGroup = "selected";
  8. var cnt = count;
  9. filterOnGroup = "items";
  10. return cnt;
  11. }
  12.  
  13. delegate:
  14. Rectangle {
  15. id: listItem
  16. width: listViewId.width
  17. height: 50
  18.  
  19. color: (listItem.DelegateModel.inSelected) ?
  20. "#575757" : "#d3d3d3";
  21. Text {
  22. id: nameText
  23. font.pixelSize: 18
  24. text: "<b>" + NAME_c + "</b>"
  25. color: (listItem.DelegateModel.inSelected) ?
  26. "white" : "black"
  27. }
  28.  
  29. Text {
  30. anchors.left: nameText.left
  31. anchors.right: parent.right
  32. anchors.top: nameText.bottom
  33. text: "<i>" +
  34. dbHelper.getElementType(ELEMENT_TYPE_ID_c) +
  35. "</i>"
  36. color: (listItem.DelegateModel.inSelected) ?
  37. "white" : "black"
  38. }
  39. MouseArea{
  40. anchors.fill: parent
  41. onClicked:{
  42. if (mouse.button === Qt.LeftButton){
  43. if (mouse.modifiers & Qt.ControlModifier){
  44. listItem.DelegateModel.inSelected =
  45. !listItem.DelegateModel.inSelected;
  46.  
  47. }else{
  48. //I am ashamed for that :(
  49. visualModel.items.removeGroups(0,
  50. visualModel.items.count,
  51. ["selected"]);
  52. listItem.DelegateModel.inSelected = true;
  53. }
  54.  
  55. xTextInput.text = X_c;
  56. yTextInput.text = Y_c;
  57. zTextInput.text = Z_c;
  58. listViewId.curentElemId = ID_c;
  59.  
  60. }
  61. }
  62. }
  63.  
  64. }
  65.  
  66. }
  1. ScrollView{
  2. anchors.left: searchPanel.left
  3. anchors.right: searchPanel.right
  4. anchors.top: searchPanel.bottom
  5. anchors.topMargin: searchPanel.height * 0.1
  6. anchors.bottom: elemBtnsPanel.top
  7. anchors.bottomMargin: elemBtnsPanel.height * 0.1
  8.  
  9. ListView {
  10. id: listViewId
  11. visible: true
  12. focus: true
  13. currentIndex: -1
  14. clip: true;
  15. cacheBuffer: 100000
  16.  
  17. snapMode: ListView.SnapToItem
  18.  
  19. model: visualModel
  20. enabled: {return !isEditable}
  21.  
  22. anchors.fill: parent
  23.  
  24. property int curentElemId: 0;
  25. }
  26. }

В качестве модели выступает наследник от QSqlQueryModel.

Проблема, в том, что при выборе элеметна на ListView список пролистывается в конец.

2

Вам это нравится? Поделитесь в социальных сетях!

2
Andrei Yankovich
  • 5 июня 2019 г. 12:27

Выполнять селект элементов на view это архитектурная ошибка.
Тебе нужно сделать метод select в своей модели (наследник от QSqlQueryModel), там будут выполнятся операции по выборке а также должно быть свойство отображающие какой элемент сейчас выделен.

Что касается перелистывания списка, то подазриваю что вы используете методы BeginResetModel and endResetModel, эти методы полностью перестраивают вьюшку а значит и сбивают скрол. Нужно использовать:

    DE
    • 5 июня 2019 г. 12:55
    • Ответ был помечен как решение.

    Проблема была в смене фильтра в функции.

    1. function itemsInSelected(){
    2. filterOnGroup = "selected";
    3. var cnt = count;
    4. filterOnGroup = "items";
    5. return cnt;
    6. }

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь