【问题标题】:QML and comboBox inside TableViewTableView 中的 QML 和组合框
【发布时间】:2020-01-12 08:31:46
【问题描述】:

我正在尝试在 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
        }
    }
}

但是当我更改组合框的值,然后向下滚动时,其他一些组合框会更改它们的值。

即,如果我更改第一个组合并滚动,第一个组合的值将显示在另一个组合上(似乎是随机选择的),并且第一个组合似乎被重置。如果我再次滚动,另一个组合会改变值。

【问题讨论】:

    标签: qt combobox qml tableview


    【解决方案1】:

    这是因为当您滚动时,TableView 会回收委托,而不是销毁看不见的委托并重新创建将要显示的委托。这有助于性能。 在您的情况下,当委托被 TableView 随机播放时,您的状态会保持不变。

    您不应该将状态存储在委托中,而应该将其存储在外部。

    您可以在这里阅读更多信息:https://doc.qt.io/qt-5/qml-qtquick-tableview.html#reusing-items

    【讨论】:

    【解决方案2】:

    根据您使用的平台,有两个 po

    #2 编辑

    根据文档,这也可能是由于您的 Qt 版本中 TableView 的标准行为

    当一个项目被弹出时,它会移动到重用池,这是一个未使用项目的内部缓存。发生这种情况时,会发出 TableView::pooled 信号以通知项目。同样,当项目从池中移回时,会发出 TableView::reused 信号。

    当项目被重复使用时,来自模型的任何项目属性都会更新。这包括索引、行和列,还包括任何模型角色。

    注意:避免在委托中存储任何状态。如果这样做,请在接收到 TableView::reused 信号时手动重置它。

    在 TableView 上将 reuseItems 设置为 false 将解决此问题。

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

    【讨论】:

    • 嗨,迈克。我使用 QT 5.12。我实施了您建议的解决方案。但问题仍然存在。我制作了一个视频来演示这个问题:streamable.com/in6nh 我还添加了一个新的列,不是在组合框上开始 scolling,而是在一个简单的文本上。首先,所有组合框都初始化为 Banana。然后我改变其中一个,其他的随机改变。我会按照你的建议尝试使用 Qt 5.14。谢谢。
    • 我尝试使用此版本的 QT:Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) Built on Dec 10 2019 12:27:13 但即使问题仍然存在使用“focusPolicy:Qt.StrongFocus”。它比没有人面对这种行为更可怕,代码非常简单......
    【解决方案3】:

    我都是,

    感谢 QT 论坛上的回答,我解决了我的问题。这是我实施的解决方案:forum.qt.io/topic/110624/qml-and-combobox-inside-tableview

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多