Как достичь функциональности, аналогичной IValueConverter в WPF - PullRequest
0 голосов
/ 10 июля 2020

В моем ListView есть эти:

ListView{
    id: listView
    Layout.fillHeight: true
    Layout.fillWidth: true
    model: addContext.newLease.receivables
    delegate: ItemDelegate{
        width: parent.width
        topPadding: 0
        bottomPadding: 0
        contentItem:  RowLayout{
            Text{
                text: modelData.headId //mainContext.receivableHeads....name
                Layout.preferredWidth: parent.width / 2
            }
            Text{
                text: modelData.amount
                horizontalAlignment: Text.AlignRight
            }
            PathButton{
                pathData: C.minusIcon
                Layout.alignment: Qt.AlignRight
                hasToolTip: false
                onClicked: addContext.removeReceivable(listView.currentIndex)
            }
        }
    }
}

С этим у меня есть проблема Layout, НО я спрошу об этом позже. Здесь, в первом Text contentItem, у меня есть номер headId, и он представляет это число в ListView с этим modelData.headId, НО я хочу вместо этого представить name. Модель addContext.newLease.receivables, не содержит name, у нее есть только следующие свойства:

class Receivable : public QObject{
    Q_OBJECT
    Property(int, leaseId)
    Property(int, headId)
    Property(int, amount)
};

name, соответствующий headId, находится в mainContext.receivableHeads, который имеет следующие свойства:

class Head : public QObject{
    Q_OBJECT
    Property(int, id)
    Property(int, controlId)
    Property(QString, name)
    Property(QString, description)
};

Я хочу получить name из mainContext.receivableHeads, сопоставив headId из modelData с id из mainContext.receivableHeads.

EDIT

Это:

Q_INVOKABLE QString headName(int headId){
    foreach(auto head, mvm->receivableHeads()){
        if(head->id() == headId)
            return head->name();
    }
}

вместе с этим:

text: addContext.headName(modelData.headId) //modelData.headId //mainContext.receivableHeads.indexOf(modelData).name 

, как было предложено Thomenson , работает. Мой receivableHeads - крошечный список, поэтому он хороший кандидат на javascript, есть ли встроенная функция javascript, которая делает это?

Ну, я не знал, что javascript работает так:

text: {
    for(var i =0; i < mainContext.receivableHeads.length; i++){
        if(mainContext.receivableHeads[i].id === modelData.headId)
            return mainContext.receivableHeads[i].name
    }
}

тоже работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...