Как разделить дизайн и лог c Repeater в QML - PullRequest
2 голосов
/ 08 мая 2020

При использовании QML Qt Creator советует разделить дизайн и logi c на 2 файла QML, например File.qml и FileForm.ui.qml, первый для logi c, второй для дизайна. Он может отображать файл в визуальном дизайнере, только если он не содержит сложного кода, такого как вызовы функций или блоки кода {} (я использую Qt Creator 4.5.2, который поставляется с Ubuntu 18.04).

Теперь для вопрос: как перенести сложный код из ui.qml, когда я использую Repeater и его делегаты?

Пример:

My FileForm.ui.qml выглядит так:

import "displayutils.js" as Utils

RowLayout {
    property alias rr: rr
    property alias tt: tt
    Repeater {
        id: rr
        Text {
            id: tt
            text: "text: "+ Utils.fmtTemp(modelData.temp)+" / "+Utils.fmtPressure(modelData.pressure)
        }
    }
}

Я создаю его в File.qml следующим образом:

File {
    Component.onCompleted: {
        rr.model = ... // some model from C++ code, does not matter.
    }    
}

Теперь Qt Creator не хочет открывать файл FileForm.ui.qml из-за сложного форматирования текста, и мне нужно переместить его в File. qml. Как мне это сделать правильно? Что бы я ни пробовал, я теряю объект modelData из Repeater. Я пробовал разные варианты этого:

File {
    tt.text = someFunction(modelData)
    Component.onCompleted: {
        rr.model = ... // some model from C++ code, does not matter.
    }    
}

1 Ответ

0 голосов
/ 08 мая 2020

Я нахожу это разделение очень полезным и использую его постоянно. Вы можете сделать это в этом случае, разделив дочерние элементы Repeater следующим образом:

RepeaterTextForm.ui.qml:

Text {}

RepeaterText.qml:

import "displayutils.js" as Utils 

RepeaterTextForm {
    text: (
        "text: " + 
        Utils.fmtTemp(modelData.temp) + 
        " / " + 
        Utils.fmtPressure(modelData.pressure)
    )
}

FileForm.ui.qml:

RowLayout {
    property alias rr: rr
    Repeater {
        id: rr
        RepeaterText {}
    }
}

File.qml:

File {
    Component.onCompleted: {
        rr.model = ... // some model from C++ code, does not matter.
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...