QML и comboBox внутри TableView - PullRequest
       28

QML и comboBox внутри TableView

0 голосов
/ 12 января 2020

Я пытаюсь разработать мобильное приложение с comboBox внутри TableView.

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.2
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
import QtQuick.Controls.Styles 1.2

ApplicationWindow {

    visible: true
    width: 640
    height: 480
    title: qsTr("Scroll")

    Component.onCompleted: {
        var i=0;
        for(;i<50;i++)
        {
            console.log("ApplicationWindow.onCompleted");

            var myBoject = {"text":"Banana"};
            idListModelForFlightToExport.append(myBoject);
        }

    }

    ListModel {
        id: idListModelForFlightToExport
    }

    Component  {
        id: checkBoxDelegate
        ComboBox {
            anchors.fill: parent;
            model: [ {"text":"Banana"}, {"text":"Apple"}, {"text":"Coconut"} ]
            textRole: "text";
            Component.onCompleted: {
                console.log("checkBoxDelegate.onCompleted");
            }
        }
    }

    TableView {
        id: idTableViewFlightsToExport

        sortIndicatorVisible: false

        model: idListModelForFlightToExport
        anchors.fill: parent
        TableViewColumn {
            id: isExportedColumn
            title: qsTr("Column")
            movable: false
            resizable: false
            delegate:checkBoxDelegate
        }
    }
}

Но когда я изменяю значение comboBox, а затем прокручиваю вниз, некоторые другие comboBox меняют свое значение.

т.е. если я изменю первое комбо и прокручиваю, значение первого комбо будет отображаться в другом комбо (которое кажется случайным образом выбранным), а первое комбо, похоже, будет сброшено. Если я прокручиваю еще раз, другое значение изменения комбо.

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Это потому, что при прокрутке TableView перераспределяет делегатов вместо того, чтобы уничтожать делегатов, которые go вне поля зрения, и воссоздавать тех, которые будут отображаться. Это помогает производительности. В вашем случае ваше состояние сохраняется, когда делегат перетасовывается с помощью TableView.

Вы не должны хранить состояние в делегате, вы должны хранить его снаружи.

Вы можете прочитать больше об этом здесь: https://doc.qt.io/qt-5/qml-qtquick-tableview.html#reusing -items

0 голосов
/ 17 января 2020

Я все,

Благодаря ответам на форуме QT я решил свою проблему. Вот решение, которое я реализовал: forum.qt.io / topic / 110624 / qml-and-combobox-inside-tableview

Надеюсь, это поможет.

0 голосов
/ 12 января 2020

В зависимости от того, какую платформу вы используете, существует два po

# 2 EDIT

в соответствии с документацией, это также может быть связано со стандартным поведением TableView в вашей версии Qt

Когда элемент отбрасывается, он перемещается в пул повторного использования, который является внутренним кешем неиспользуемых элементов. Когда это происходит, выдается сигнал TableView :: pooled, чтобы сообщить об этом элементу. Аналогичным образом, когда элемент перемещается назад из пула, генерируется сигнал TableView :: reused.

Все свойства элемента, полученные из модели, обновляются при повторном использовании элемента. Это включает в себя индекс, строку и столбец, а также любые роли модели.

Примечание. Избегайте сохранения любого состояния внутри делегата. Если вы это сделаете, сбросьте его вручную при получении сигнала TableView :: reused.

Установка значения false для reuseItems в TableView решит проблему.

  TableView {
        id: idTableViewFlightsToExport
        reuseItems: false
        sortIndicatorVisible: false

        model: idListModelForFlightToExport
        anchors.fill: parent
        TableViewColumn {
          id: isExportedColumn
          title: qsTr("Column")
          movable: false
          resizable: false
          delegate:checkBoxDelegate
        }
    }
...