3

データ (C++) を視覚化 (QML のリスト) から厳密に分離しようとしています。モデル側では、データは C++ クラス (Data.cpp) のインスタンスに格納され、そのインスタンスへのポインターは別の C++ クラス (Parser.cpp) によって 2 つのリスト (completeList と selectedList) に配置されます。これら 2 つのリストは、次の制限付きで QML で表示する必要があります。

  • completeList のデータは、異なる QML ListViews に表示されます (たとえば、名前に従って)
  • この分離は、Parses.cpp (完全なリストのみを提供する) ではなく、QML で行う必要があります。
  • リスト項目を completeList から selectedList に追加できる必要があります (たとえば、クリックすることによって)。
  • Data の値が 1 つの ListView で変更された場合、Data 自体と、この Data を表示する他のビューもそれに応じて変更する必要があります。

ksimons のおかげで、半分はできる方法が見つかりましたが、残りはわかりません。これが私がこれまでに得たものです:

データ.h

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

public:
    Data(const QString &n) : _name(n) { }
    QString name() const { return _name; }

    void setName(const QString &n) {
        if (_name == n)
            return;
        _name = n;
        emit nameChanged(n);
    }

signals:
    void nameChanged(const QString &n);

private:
    QString _name;
};

パーサー.h

class Parser : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QQmlListProperty<Data> completeList READ completeList CONSTANT)
    Q_PROPERTY(QQmlListProperty<Data> selectedList READ selectedList CONSTANT)

public:
    Parser(QObject *parent = 0) {
         Data* d1 = new Data(QStringLiteral("a1"));
         Data* d2 = new Data(QStringLiteral("a2"));
         Data* d3 = new Data(QStringLiteral("a3"));
         Data* d4 = new Data(QStringLiteral("b1"));
         Data* d5 = new Data(QStringLiteral("b2"));

        _completeList.append(d1);
        _completeList.append(d2);
        _completeList.append(d3);
        _completeList.append(d4);
        _completeList.append(d5);

        _selectedList.append(d1);
        _selectedList.append(d4);
    }

    QQmlListProperty<Data> completeList() {
        return QQmlListProperty<Data>(this, _completeList);
    }
    QQmlListProperty<Data> selectedList() {
        return QQmlListProperty<Data>(this, _selectedList);
    }

private:
    QList<Data*> _completedList;
    QList<Data*> _selectedList;
};

QML 部分:

ListView
{
    id: startsWithA
    anchors.fill: parent
    delegate: delegateItem
}
ListView
{
    id: startsWithB
    anchors.fill: parent
    delegate: delegateItem
}
ListView
{
    id: selectedData
    anchors.fill: parent
    delegate: delegateItem
}
Item 
{
     id: delegateItem
     height: 30
     width: parent.width

     Text { text: name }

     MouseArea { //change name of corresponding Data and other views accordingly
     anchors.fill: parent
     onClicked: model.name = "newName";} //does not work

     MouseArea { //add to selectedList in Parser
     anchors.fill: parent
     onClicked: ?????? }
}
Component.onCompleted:
{
    selectedData.model = parser.seletedList;
    var listAll = parser.completeList;
    var listA, listB;
    for(var i=0; i<listAll.length; i++)
    {
        if(listAll[i].name.charAt(0) == 'a')
        {
            //changing values in startsWithA does not affect anything else with that :(
            listA.append(listAll[i]); 
        }
        else if(listAll[i].name.charAt(0) == 'b')
        {
            //changing values in startsWithB does not affect anything else with that :(
            listB.append(listAll[i]); 
        }
        //...
    }
    startsWithA.model = listA;
    startsWithB.model = listB;
    //...
}

この質問が具体的なものではなく、誰かが私を助けてくれることを願っています. 前もって感謝します。

4

0 に答える 0