qml + master-detail

Я хочу использовать qml с интерфейсом master-detail, но я не знаю, как правильно передать текущий элемент в подробный вид. ListView в главном представлении использует модель C ++ (надстройка QSQLTableModel, она отлично работает), и я вижу два способа передачи элемента:

  1. Создайте классы C ++ с полями со статическими именами, такими как имена полей QSqlRecord, и передайте их в qml с помощью w->rootContext()->setContextProperty() (w — QDeclarativeView *), но теперь я не использую какие-либо классы, подобные этому, и могу изменить свою базу данных и представления qml без изменения кода на c ++, я хотел бы сохранить его

  2. Создайте много свойств в любой детали qml, как

    Rectangle {
    id: mainRect
    property alias myFieldName: txt_nominal.text
    Column {
    
    width: parent.width
    Text {
    id: txt_nominal
    font.bold: true
    }
    }
    }
    

и установите эти свойства из кода C ++, установив w->rootContext()->setContextProperty(record.fieldName(i),record.field(i).value()); (запись — QSqlRecort в текущей строке)

Есть ли более простой способ решить мою проблему?

PS Код, который я написал выше, не проверяется на точность, а написан, чтобы было более понятно, что я имею в виду

UPD

Может быть, это кому-нибудь пригодится, я обнаружил 3-й способ, скорее, модификацию второго — вы можете обернуть поля в QVariantMap и передать только один объект в qml. Это именно то, что я хотел

в cpp:

QVariantMap testObject;
testObject["testField"]="first string from cpp";
testObject["testField2"]="second string from cpp";
rootContext()->setContextProperty("testObject",testObject);

в qml:

Text {
id: simpleTextt
text: testObject.testField
anchors.centerIn: parent
}

4

Решение

Вы могли бы использовать isCurrentItem свойство делегата для передачи данных из делегата ListView в ваши данные qml. Таким образом, вы можете обойтись без добавления дополнительного кода на C ++. Это в основном ваш второй подход, но без C ++. Вам также не нужно добавлять много свойств, если каждый из ваших элементов QML, которые вы хотите изменить, имеет Я бы.

Если у вас есть несколько разных QML для разных представлений сведений, вам также придется использовать загрузчик для загрузки соответствующих подробностей QML.

Просто игрушечный пример, предполагающий, что у вас есть только один шаблон сведений для всех ваших элементов в списке (как упоминалось выше, если это не так, чем вы можете использовать загрузчик вместо detailsRect):

Rectangle {
width: 300; height: 400

Rectangle {
id: detailsRect
anchors.right: parent.right
width: 100
height: 500
color: "blue"Text {
id: detailsText
text: ""}
}

ListView {
id: list
anchors.fill: parent
model: 20

delegate: Rectangle {
color: ListView.isCurrentItem ? "red" : "green"width: 40
height: 40

Text {
text: index
}

ListView.onIsCurrentItemChanged: {
if(ListView.isCurrentItem)
{
detailsRect.color = "yellow"detailsText.text = index
}
}

MouseArea {
anchors.fill: parent
onClicked: {
list.currentIndex = index
}
}
}
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]