QT QML Listview 与 QInvokable 模型的问题

问题描述 投票:0回答:1

我对 listview 元素和 c++ AbstractListModel 的供应有问题。

如果我通过 qproperty 传递列表模型,列表条目将正确显示。

如果我通过 qinvokable 传递列表模型,则仅在第一次调用页面时显示列表。如果我第二次调用该页面(无论使用相同还是不同的列表模型),列表仍为空。

ColumnLayout { anchors.fill: parent;
        ListView { id: listview; Layout.fillWidth: true;  Layout.fillHeight: true;
            DelegateChooser {
                id: items
                role: "r_type"
                DelegateChoice { roleValue: type1; SelectlistDelegateITL { p_height: p_listheight; p_width: list.width; p_index: index; p_column1: r_col1; p_column2: r_col2; p_isHeader: false }}
                DelegateChoice { roleValue: type2; SelectlistDelegateI2TL { p_height: p_listheight; p_width: list.width; p_index: index; p_column1: r_col1; p_column2: r_col2; p_column3: r_col3; p_isHeader: false }}
            }   
            //model: cp_screen.selectlistModelA
            model: cp_screen.getSelectlistModelB()
            //currentIndex: cp_screen.getSelectlistIndex(p_key)
            currentIndex: 0
            header: SelectlistDelegateI2TL { p_height: p_listheight; p_width: list.width; p_index: -1; p_column1: cp_screen.getListHeaderIcon(p_key); p_column2: cp_screen.getListHeaderText(p_key); p_isHeader: true }
            delegate: items
            spacing: p_listspacing
        }
    }

Q属性:

Q_PROPERTY(SelectlistModel* selectlistModelA READ getSelectlistModelA NOTIFY signalSelectlistModelChanged)

SelectlistModel* getSelectlistModelA() { return m_model->selectlistModels.first(); }

Q可调用:

Q_INVOKABLE SelectlistModel* getSelectlistModelB() { return m_model->selectlistModels.first(); }

当尝试通过QInvokable时,视图中仍然有相应的连接用于更新模型

Connections { target: cp_screen; function onSignalSelectlistModelChanged() { listview.model = cp_screen.getSelectlistModelB() } }

GetSelectListModelA 和 getSelectlistModelB 返回相同的模型

知道 QInvokable 方式出了什么问题吗?

qt listview qabstractlistmodel
1个回答
0
投票

在我看来,问题不在于分配模型,而在于模型本身。在前一种使用 Q_PROPERTY 的方法中,每次更改都会重新分配模型,这是不正确的。以下代码可能会给出与 Q_INVOKABLE 相同的结果:

Q_PROPERTY(SelectlistModel* selectlistModelA READ getSelectlistModelA CONSTANT)

这样,ListView 一次获取模型并在需要时说明其信息。现在的问题是为什么数据没有更新。具体答案需要查看您的 QAbstractListModel 继承类。然而,问题通常在于没有发出

dataChanged
信号。详细来说,模型收到新信息后,应该通知它更新视图:

QModelIndex topIndex = createIndex(first_row,0);
QModelIndex bottomIndex = createIndex(end_row,0);
emit dataChanged(topIndex,bottomIndex,QList<int>({roles}));

否则,ListView 保留初始值。此外,如果变化很大并且包括诸如

rowCount
之类的修改,则一种临时未优化解决方案是重置整个模型,这应该给出与PROPERTY通知重新分配方法相同的结果:

beginResetModel();
endResetModel();

尽管除非有必要,否则应该避免。

© www.soinside.com 2019 - 2024. All rights reserved.