C++ 获取QList对象的ListView索引

C++ 获取QList对象的ListView索引,c++,qt,qml,model-view,C++,Qt,Qml,Model View,我已经公开了一个QList作为列表视图的模型。但是如何获取MyItem*对象的ListView索引呢 上下文:我在C++中创建了一个FiffObjutTo.()函数,当我找到对象(A MyItitem */Cuff>)时,我想滚动到 ListVIEW < /C> >中的对应项。 一些代码(完整的源代码和Qt Creator项目可以在中找到) 项目类别: class MyItem : public QObject { Q_OBJECT Q_PROPERTY(qint32 data

我已经公开了一个
QList
作为
列表视图的模型。但是如何获取
MyItem*
对象的
ListView
索引呢

上下文:我在C++中创建了一个FiffObjutTo.()函数,当我找到对象(A<代码> MyItitem */Cuff>)时,我想滚动到 ListVIEW < /C> >中的对应项。 一些代码(完整的源代码和Qt Creator项目可以在中找到)

项目类别:

class MyItem : public QObject
{
    Q_OBJECT
    Q_PROPERTY(qint32 data READ data NOTIFY dataChanged)

public:
    MyItem() : m_data(s_counter++) {}

    quint32 data() const { return m_data; }

signals:
    void dataChanged();

private:
    static int s_counter;
    int m_data;
};
模型:

class MyCppModel : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QQmlListProperty<MyItem> itemList READ itemList NOTIFY itemListChanged)

public:
    MyCppModel()
    {
        m_specialItem = new MyItem;

        m_model.append(new MyItem);
        m_model.append(new MyItem);
        m_model.append(new MyItem);
        m_model.append(m_specialItem);
        m_model.append(new MyItem);
    }

    QQmlListProperty<MyItem> itemList()
    {
        return QQmlListProperty<MyItem>(this, m_model);
    }

    Q_INVOKABLE QVariant specialItem()
    {
        return QVariant::fromValue(m_specialItem);
    }

signals:
    void itemListChanged();

private:
    QList<MyItem*> m_model;
    MyItem* m_specialItem; // simulate found item
};

根据您的应用程序逻辑,有几种方法可以做到这一点

1。将
isSpecialItem
属性添加到
MyItem

class MyItem : public QObject
{
    Q_OBJECT
    Q_PROPERTY(qint32 data READ data NOTIFY dataChanged)
    Q_PROPERTY(bool isSpecialItem READ isSpecialItem WRITE setIsSpecialItem NOTIFY isSpecialItemChanged)
    // ...
}
然后,您的代理将如下所示:

Rectangle {
    width: parent.width
    height: 20
    color: "#34495e"
    border.width: 1
    border.color: isSpecialItem ? "red" : "black"

    Text {
        x: 10
        anchors.verticalCenter: parent.verticalCenter
        text: modelData.data
        color: "white"
    }
}

这是最简单的方法,但是污染代码<> MyItAs/Cuff>,你可能会考虑更多UI特定的东西。

2。使
MyCppModel
派生自
qabstractemodel

class MyItem : public QObject
{
    Q_OBJECT
    Q_PROPERTY(qint32 data READ data NOTIFY dataChanged)
    Q_PROPERTY(bool isSpecialItem READ isSpecialItem WRITE setIsSpecialItem NOTIFY isSpecialItemChanged)
    // ...
}
使用此选项,您可以在代理中使用
SpecialItem
,代理的QML代码与选项#1相同

我将此称为解决此问题的规范方法,特别是当
itemList
不需要是
qqmlistproperty
时。它不需要将可能特定于UI的
isSpecialItem
属性添加到
MyItem
,并且可以与当前存储它的方式相同;在函数中,您可以编写如下内容:

if (role == SpecialItem) {
    return QVariant(m_specialItem == m_model.at(index.row()));
}
3。将特殊项作为列表的索引属性公开

要这样做,您需要将
specialItem()
函数转换为
MyCppModel
的属性:

Q_PROPERTY(int specialItemIndex READ specialItemIndex WRITE specialItemIndex NOTIFY specialItemIndexChanged)
然后,您的学员看起来与选项2非常相似,除了一行:

border.color: myCppModel.specialItemIndex == index ? "red" : "black"

你试过什么?您的代码是什么样子的(例如,包含
qqqmlistproperty
的类)?我想的答案是直截了当的,所以当有两张赞成票但没有答案时,我觉得我遗漏了一些东西。@Mitch:我添加了一些来源。很可能是我遗漏了一些简单的东西——我是Qt/Qml的初学者。对于Qml创建的模型(
liselement
),它只需在委托中调用
index
,但我不确定它在公开外部模型时是否工作相同
border.color: myCppModel.specialItemIndex == index ? "red" : "black"