fix: comprehensive boot warnings and exceptions — fixable silenced, unfixable diagnosed

Build system (5 gaps hardened):
- COOKBOOK_OFFLINE defaults to true (fork-mode)
- normalize_patch handles diff -ruN format
- New 'repo validate-patches' command (25/25 relibc patches)
- 14 patched Qt/Wayland/display recipes added to protected list
- relibc archive regenerated with current patch chain

Boot fixes (fixable):
- Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset)
- D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped)
- redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped)
- daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch)
- udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async)
- relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs
- greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait)
- greeter-ui: built and linked (header guard unification, sem_compat stubs removed)
- mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps
- greeter config: removed stale keymapd dependency from display/greeter services
- prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified

Unfixable (diagnosed, upstream):
- i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort
- kded6/greeter-ui: page fault 0x8 — Qt library null deref
- Thread panics fd != -1 — Rust std library on Redox
- DHCP timeout / eth0 MAC — QEMU user-mode networking
- hwrngd/thermald — no hardware RNG/thermal in VM
- live preload allocation — BIOS memory fragmentation, continues on demand
This commit is contained in:
2026-05-05 20:20:37 +01:00
parent a5f97b6632
commit f31522130f
81834 changed files with 11051982 additions and 108 deletions
@@ -0,0 +1,52 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# Generated from qqmldelegatemodel.pro.
#####################################################################
## tst_qqmldelegatemodel Test:
#####################################################################
if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
cmake_minimum_required(VERSION 3.16)
project(tst_qqmldelegatemodel LANGUAGES CXX)
find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
endif()
# Collect test data
file(GLOB_RECURSE test_data_glob
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
data/*)
list(APPEND test_data ${test_data_glob})
qt_internal_add_test(tst_qqmldelegatemodel
SOURCES
tst_qqmldelegatemodel.cpp
LIBRARIES
Qt::CorePrivate
Qt::Gui
Qt::Qml
Qt::QmlModelsPrivate
Qt::Qml
Qt::QmlPrivate
Qt::Quick
Qt::QuickPrivate
Qt::QuickTestUtilsPrivate
TESTDATA ${test_data}
)
#### Keys ignored in scope 1:.:.:qqmldelegatemodel.pro:<TRUE>:
# OTHER_FILES = "data/*"
## Scopes:
#####################################################################
qt_internal_extend_target(tst_qqmldelegatemodel CONDITION ANDROID OR IOS
DEFINES
QT_QMLTEST_DATADIR=":/data"
)
qt_internal_extend_target(tst_qqmldelegatemodel CONDITION NOT ANDROID AND NOT IOS
DEFINES
QT_QMLTEST_DATADIR="${CMAKE_CURRENT_SOURCE_DIR}/data"
)
@@ -0,0 +1,21 @@
import QtQuick 2.0
Item {
property var isSelected: null
property string source
implicitWidth: 16
implicitHeight: 16
onSourceChanged: {
updateImageSource()
}
onIsSelectedChanged: {
updateImageSource()
}
function updateImageSource() {
let result = isSelected ? source + "_selected_dark.png" : source + "_active_dark.png"
}
}
@@ -0,0 +1,6 @@
import QtQml
QtObject {
property int rowCount: 1
signal expandedRowHeightChanged()
}
@@ -0,0 +1,25 @@
pragma ComponentBehavior: Bound
import QtQuick
Item {
id: timeMarks
property QtObject model
property int rowCount: model ? model.rowCount : 0
Connections {
target: timeMarks.model
function onExpandedRowHeightChanged() {
console.log("necessary")
}
}
Repeater {
id: rowRepeater
model: timeMarks.rowCount
Rectangle {
objectName: "zap"
// required property int index <-- would prevent the crash
}
}
}
@@ -0,0 +1,12 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQml.Models 2.15
import QtQuick 2.15
import Test 1.0
DelegateModel {
model: AbstractItemModel {}
delegate: Item {}
}
@@ -0,0 +1,138 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Layouts
import QtQml.Models
Window {
id: root
width: 640
height: 480
visible: true
color: "#111111"
Column {
spacing: 1
Repeater {
model: 1000
Rectangle {
width: 100
height: 100
color: "grey"
DelegateModel {
id: delegateModel
delegate: Rectangle {
width: 100
height: 20
color: "black"
Text {
anchors.centerIn: parent
text: "Name: " + model.name
color: "white"
}
}
property int length: 0
property var filterAcceptsItem: function(item) { return true; }
model: ListModel {
id: myModel
ListElement {
name: "tomato"
classifications: [
ListElement { classification: "fruit" },
ListElement { classification: "veg" }
]
nutritionFacts: [
ListElement {
calories: "45"
}
]
}
ListElement {
name: "apple"
classifications: [
ListElement { classification: "fruit" }
]
nutritionFacts: [
ListElement {
calories: "87"
}
]
}
ListElement {
name: "broccoli"
classifications: [
ListElement { classification: "veg" }
]
nutritionFacts: [
ListElement {
calories: "12"
}
]
}
ListElement {
name: "squash"
classifications: [
ListElement { classification: "veg" }
]
nutritionFacts: [
ListElement {
calories: "112"
}
]
}
}
groups: [
DelegateModelGroup { id: visibleItems; name: "visible" },
DelegateModelGroup { name: "veg" },
DelegateModelGroup { name: "fruit"; includeByDefault: true }
]
function update() {
// Step 1: Filter items
var visible = [];
for (var i = 0; i < items.count; ++i) {
var item = items.get(i);
if (filterAcceptsItem(item.model)) {
visible.push(item);
}
}
// Step 2: Add all items to the visible group:
for (i = 0; i < visible.length; ++i) {
items.insert(visible[i], delegateModel.filterOnGroup)
}
delegateModel.length = visible.length
}
items.onChanged: update()
onFilterAcceptsItemChanged: update()
filterOnGroup: "visible"
Component.onCompleted: {
for(var i = 0; i < myModel.count; i++) {
var temp = 0;
var entry = myModel.get(i);
for (var j = 0; j < entry.classifications.count; j++) {
temp = entry.classifications.get(j)
items.insert(entry, temp.classification)
}
}
}
}
}
}
}
}
@@ -0,0 +1,31 @@
import QtQuick 2.0
Item {
id: root
width: 640
height: 480
property bool works: myView.currentItem.okay
ListView {
id: myView
model: myModel
anchors.fill: parent
delegate: Row {
property alias okay: image.isSelected
ImageToggle {
id: image
source: "glyph_16_arrow_patch"
isSelected: model.age < 6
}
Text {
text: "age:" + model.age + " selected:" + image.isSelected
}
}
}
ListModel {
id: myModel
ListElement { type: "Cat"; age: 3; }
ListElement { type: "Dog"; age: 2; }
}
}
@@ -0,0 +1,99 @@
import QtQml
import Test
DelegateModel {
id: root
property Component typedDelegate: QtObject {
required property QtObject model
required property real x
property real immediateX: x
property real modelX: model.x
function writeImmediate() {
x = 1;
}
function writeThroughModel() {
model.x = 3;
}
}
property Component untypedDelegate: QtObject {
property real immediateX: x
property real modelX: model.x
function writeImmediate() {
x = 1;
}
function writeThroughModel() {
model.x = 3;
}
}
property ListModel singularModel: ListModel {
ListElement {
x: 11
}
ListElement {
x: 12
}
}
property ListModel listModel: ListModel {
ListElement {
x: 11
y: 12
}
ListElement {
x: 15
y: 16
}
}
property var array: [
{x: 11, y: 12}, {x: 19, y: 20}
]
property QtObject object: QtObject {
property int x: 11
property int y: 12
}
function xAt0() : real {
switch (modelIndex) {
case Model.Singular:
case Model.List:
return model.get(0).x
case Model.Array:
return model[0].x
case Model.Object:
return model.x
}
return -1;
}
property int modelIndex: Model.None
property int delegateIndex: Delegate.None
model: {
switch (modelIndex) {
case Model.Singular: return singularModel
case Model.List: return listModel
case Model.Array: return array
case Model.Object: return object
}
return undefined;
}
delegate: {
switch (delegateIndex) {
case Delegate.Untyped: return untypedDelegate
case Delegate.Typed: return typedDelegate
}
return null
}
}
@@ -0,0 +1,34 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
Window {
width: 640
height: 480
title: qsTr("Hello World")
ListView {
width: 200; height: 400
model: ListModel {
ListElement { c: "red" }
ListElement { c: "green" }
ListElement { c: "blue" }
ListElement { c: "purple" }
ListElement { c: "orange" }
ListElement { c: "red" }
ListElement { c: "brown"}
}
delegate: DelegateChooser {
role: "c"
DelegateChoice { roleValue: "red"; Rectangle { color: modelData; width: 200; height: 50 } }
DelegateChoice { roleValue: "green"; Rectangle { color: modelData; width: 200; height: 50 } }
DelegateChoice { roleValue: "blue"; Rectangle { color: modelData; width: 200; height: 50 } }
DelegateChoice { roleValue: "purple"; Rectangle { color: modelData; width: 200; height: 50 } }
DelegateChoice { roleValue: "orange"; Rectangle { color: modelData; width: 200; height: 50 } }
DelegateChoice { roleValue: "brown"; Rectangle { color: modelData; width: 200; height: 50 } }
}
}
}
@@ -0,0 +1,25 @@
import QtQml
import Test
Instantiator {
objectName: object?.objectName ?? "none"
model: ChangingModel {}
delegate: DelegateChooser {
role: "theRole"
DelegateChoice {
roleValue: "Foo"
delegate: QtObject {
objectName: model.theRole
}
}
DelegateChoice {
roleValue: "Bla"
delegate: QtObject {
objectName: model.theRole
}
}
}
}
@@ -0,0 +1,50 @@
import QtQuick
import QtQml.Models
Item {
DelegateModel {
id: delegateModel
model: ListModel {
id: sourceModel
ListElement { title: "foo" }
ListElement { title: "bar" }
function clear() {
if (count > 0)
remove(0, count);
}
}
groups: [
DelegateModelGroup { name: "selectedItems" }
]
delegate: Text {
height: DelegateModel.inSelectedItems ? implicitHeight * 2 : implicitHeight
Component.onCompleted: {
if (index === 0)
DelegateModel.inSelectedItems = true;
}
}
Component.onCompleted: {
items.create(0)
items.create(1)
}
}
ListView {
anchors.fill: parent
model: delegateModel
}
Timer {
running: true
interval: 10
onTriggered: sourceModel.clear()
}
property int count: delegateModel.items.count
}
@@ -0,0 +1,10 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQml.Models 2.15
import QtQuick 2.15
DelegateModel {
model: 100
delegate: Item {}
}
@@ -0,0 +1,20 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQml.Models 2.15
import QtQuick 2.15
DelegateModel {
model: ListModel {
ListElement {
name: "Item 0"
}
ListElement {
name: "Item 1"
}
ListElement {
name: "Item 2"
}
}
delegate: Item {}
}
@@ -0,0 +1,18 @@
import QtQuick
Window {
id: window
width: 640
height: 480
visible: true
property alias testModel: repeater.model
Repeater {
id: repeater
model: 1
delegate: Item {
Component.onCompleted: repeater.model = 0
}
}
}
@@ -0,0 +1,23 @@
import QtQuick
import QtQml.Models
Item {
property QtObject modelProxy: QtObject {
property list<Model> models: [Model {}]
}
DelegateModel {
id: labelsModel
model: modelProxy.models
delegate: Loader {
objectName: "loader"
sourceComponent: TimeMarks {
model: modelData
}
}
}
Repeater {
model: labelsModel
}
}
@@ -0,0 +1,55 @@
import QtQml
import QtQml.Models
QtObject {
property DelegateModel m: DelegateModel {
id: delegateModel
model: ['one', 'two']
MyButton {
objectName: modelData
}
}
component FirstComponent : QtObject {
required property var control
}
component SecondComponent : FirstComponent {}
component MyButton : QtObject {
id: btn
property SecondComponent s: SecondComponent {
id: myContentItem
control: btn
}
}
component ThirdComponent : QtObject {
required property int row
required property var model
}
component FourthComponent: ThirdComponent {}
property DelegateModel n: DelegateModel {
id: delegateModel2
model: ['three', 'four']
FourthComponent {
objectName: model.modelData
}
}
component MyButton2 : QtObject {
property SecondComponent s: SecondComponent {
// forgetting the required property here
}
}
property DelegateModel o: DelegateModel {
id: delegateModel3
model: ['five', 'six']
MyButton2 {
objectName: modelData
}
}
}
@@ -0,0 +1,55 @@
import QtQml
DelegateModel {
id: root
property ListModel listModel: ListModel {
ListElement {
modelData: "a"
row: "b"
column: "c"
model: "d"
hasModelChildren: "e"
index: "f"
}
}
property var array: [{
modelData: "a",
row: "b",
column: "c",
model: "d",
hasModelChildren: "e",
index: "f"
}]
property QtObject object: QtObject {
property string modelData: "a"
property string row: "b"
property string column: "c"
property string model: "d"
property string hasModelChildren: "e"
property string index: "f"
}
property int n: -1
model: {
switch (n) {
case 0: return listModel
case 1: return array
case 2: return object
}
return undefined;
}
delegate: QtObject {
required property string modelData
required property string row
required property string column
required property string model
required property string hasModelChildren
required property string index
objectName: [modelData, row, column, model, hasModelChildren, index].join(" ")
}
}
@@ -0,0 +1,18 @@
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
Rectangle {
id: root
property AbstractItemModel model
ListView {
model: root.model
delegate: Item {
required property var modelData
required property var model
}
}
}
@@ -0,0 +1,62 @@
import QtQuick
import QtQuick.Window
import QtQml.Models
Window {
id: win
visible: true
width: 640
height: 480
property int destroyCount : 0;
property int createCount : 0;
property alias testListModel: mdl
DelegateModel {
id: visualModel
model: ListModel {
id: mdl
ListElement {
name: "a"
hidden: false
}
ListElement {
name: "b"
hidden: true
}
ListElement {
name: "c"
hidden: false
}
}
filterOnGroup: "selected"
groups: [
DelegateModelGroup {
name: "selected"
includeByDefault: true
}
]
delegate: Text {
visible: DelegateModel.inSelected
property var idx
Component.onCompleted: {
++createCount
idx = index
DelegateModel.inPersistedItems = true
DelegateModel.inSelected = !model.hidden
}
Component.onDestruction: ++destroyCount
text: model.name
}
}
ListView {
id: listView
model: visualModel
anchors.fill: parent
focus: true
}
}
@@ -0,0 +1,30 @@
import QtQuick
import Test
Window {
id: root
title: listView.count
property alias listView: listView
property ProxySourceModel connectionModel: null
Component {
id: modelComponent
ProxySourceModel {}
}
ListView {
id: listView
anchors.fill: parent
delegate: Text {
text: model.Name
}
model: ProxyModel {
sourceModelTest: root.connectionModel
}
}
Component.onCompleted: root.connectionModel = modelComponent.createObject(root)
}
@@ -0,0 +1,32 @@
import QtQuick 2.8
import QtQml.Models 2.1
DelegateModel {
id: visualModel
model: ListModel {
id: myLM
ListElement {
name: "Apple"
}
ListElement {
name: "Orange"
}
}
filterOnGroup: "selected"
groups: [
DelegateModelGroup {
name: "selected"
includeByDefault: true
}
]
delegate: Text {
Component.onCompleted: {
DelegateModel.inPersistedItems = true
DelegateModel.inSelected = false
}
text: "item " + index
}
}
@@ -0,0 +1,37 @@
import QtQuick
ListView {
id: view
reuseItems: true
width: 10
height: 10
model: 20
clip: true
cacheBuffer: 0
delegate: Item {
width: 1
height: 1
ListView.onPooled: {
// When pooled, immediately trigger drain by geometry change
--view.width
}
onParentChanged: {
// When unparented as result of drain, trigger another drain
if (parent === null)
++view.width
}
}
Timer {
running: true
repeat: true
interval: 1
onTriggered: {
--view.height
++view.contentY
}
}
}
@@ -0,0 +1,11 @@
import QtQuick 2.8
ListView {
id: root
width: 200
height: 200
delegate: Text {
text: display
}
}
@@ -0,0 +1,45 @@
import QtQuick 2.8
import QtQml.Models 2.1
Item {
id: root
width: 200
height: 200
DelegateModel {
id: visualModel
model: ListModel {
id: myLM
ListElement {
name: "Apple"
}
ListElement {
name: "Banana"
}
ListElement {
name: "Orange"
}
}
filterOnGroup: "selected"
groups: [
DelegateModelGroup {
name: "selected"
includeByDefault: true
}
]
delegate: Text {
Component.onCompleted: {
if (index === 1) {
DelegateModel.inSelected = false
}
}
text: index + ": " + model.name
}
}
// Needs an actual ListView in order for the DelegateModel to instantiate all items
ListView {
model: visualModel
anchors.fill: parent
}
}
@@ -0,0 +1,50 @@
import QtQml
DelegateModel {
id: root
property ListModel singularModel: ListModel {
ListElement {
a: "a"
}
ListElement {
a: "a"
}
}
property ListModel listModel: ListModel {
ListElement {
a: "a"
b: "b"
}
ListElement {
a: "a"
b: "b"
}
}
property var array: [
{a: "a", b: "b"}, {a: "b", b: "b"}
]
property QtObject object: QtObject {
property string a: "a"
property string b: "b"
}
property int n: -1
model: {
switch (n) {
case 0: return singularModel
case 1: return listModel
case 2: return array
case 3: return object
}
return undefined;
}
delegate: QtObject {
required property string a
}
}
@@ -0,0 +1,28 @@
import QtQuick
import Test
Window {
id: root
width: 200
height: 200
property alias listView: listView
ResettableModel {
id: resetModel
}
ListView {
id: listView
anchors.fill: parent
model: resetModel
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
color: "olivedrab"
required property string display
}
}
}
@@ -0,0 +1,28 @@
import QtQuick
import Test
Window {
id: root
width: 200
height: 200
property alias listView: listView
ResetInConstructorModel {
id: resetInConstructorModel
}
ListView {
id: listView
anchors.fill: parent
model: resetInConstructorModel
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
color: "olivedrab"
required property string display
}
}
}
@@ -0,0 +1,16 @@
import QtQuick
ListView {
id: root
anchors.fill: parent
property bool success: (currentItem?.mydata ?? 0) === 42
height: 300
width: 200
delegate: Rectangle {
required property var model
implicitWidth: 100
implicitHeight: 50
property var mydata: model?.foo ?? model.bar
}
}
@@ -0,0 +1,64 @@
import QtQml
DelegateModel {
id: root
// useful object as model, int as modelData
property ListModel singularModel: ListModel {
ListElement {
x: 11
}
ListElement {
x: 12
}
}
// same, useful, object as model and modelData
property ListModel listModel: ListModel {
ListElement {
x: 13
y: 14
}
ListElement {
x: 15
y: 16
}
}
// useful but different objects as modelData and model
// This is how the array accessor works. We can live with it.
property var array: [
{x: 17, y: 18}, {x: 19, y: 20}
]
// useful but different objects as modelData and model
// This is how the object accessor works. We can live with it.
property QtObject object: QtObject {
property int x: 21
property int y: 22
}
property int n: -1
model: {
switch (n) {
case 0: return singularModel
case 1: return listModel
case 2: return array
case 3: return object
}
return undefined;
}
delegate: QtObject {
required property point modelData
required property QtObject model
property real modelX: model.x
property real modelDataX: modelData.x
property point modelSelf: model
property point modelDataSelf: modelData
property point modelModelData: model.modelData
property point modelAnonymous: model[""]
}
}
@@ -0,0 +1,72 @@
import QtQml
DelegateModel {
id: root
// useful object as model, string as modelData
property ListModel singularModel: ListModel {
ListElement {
a: "a"
}
ListElement {
a: "b"
}
}
// same, useful, object as model and modelData
property ListModel listModel: ListModel {
ListElement {
a: "a"
b: "a"
}
ListElement {
a: "b"
b: "b"
}
}
// useful but different objects as modelData and model
// This is how the array accessor works. We can live with it.
property var array: [
{a: "a", b: "a"}, {a: "b", b: "a"}
]
// string as modelData
// object with anonymous string property as model.
property var stringList: ["a", "b"]
// useful but different objects as modelData and model
// This is how the object accessor works. We can live with it.
property QtObject object: QtObject {
property string a: "a"
property string b: "a"
}
// number as modelData
// object with anonymous number property as model
property int n: -1
model: {
switch (n) {
case 0: return singularModel
case 1: return listModel
case 2: return array
case 3: return stringList
case 4: return object
case 5: return n
}
return undefined;
}
delegate: QtObject {
required property var modelData
required property var model
property var modelA: model.a
property var modelDataA: modelData.a
property var modelSelf: model
property var modelDataSelf: modelData
property var modelModelData: model.modelData
property var modelAnonymous: model[""]
}
}
@@ -0,0 +1,92 @@
import QtQuick
import QtQml.Models
Item {
id: root
property bool triggered: false
onTriggeredChanged: {
rootLM.setProperty(1, "currentRole", "first");
}
width: 800
height: 680
function verify(): bool {
rootLV.currentIndex = 1; // needed for itemAtIndex to work
if (root.triggered)
return rootLV.itemAtIndex(0).isFirst && rootLV.itemAtIndex(1).isFirst;
else
return rootLV.itemAtIndex(0).isFirst && !rootLV.itemAtIndex(1).isFirst;
}
ListModel {
id: rootLM
ListElement {
currentRole: "first"
firstText: "TEXT_FIRST_1"
secondText: "TEXT_SECOND_1"
}
ListElement {
currentRole: "second"
firstText: "TEXT_FIRST_2"
secondText: "TEXT_SECOND_2"
}
}
DelegateModel {
id: delModel
model: rootLM
delegate: DelegateChooser {
id: delegateChooser
role: "currentRole"
DelegateChoice {
roleValue: "first"
Rectangle {
property bool isFirst: true
height: 30
width: rootLV.width
color: "yellow"
Text {
anchors.centerIn: parent
text: firstText + " " + currentRole
}
}
}
DelegateChoice {
roleValue: "second"
Rectangle {
property bool isFirst: false
height: 30
width: rootLV.width
color: "red"
Text {
anchors.centerIn: parent
text: secondText + " " + currentRole
}
}
}
}
}
TapHandler {
// for manual testing
onTapped: root.triggered = true
}
Rectangle {
width: 200
height: 300
anchors.centerIn: parent
border.color: "black"
border.width: 1
color: "blue"
ListView {
id: rootLV
objectName: "listview"
anchors.margins: 30
anchors.fill: parent
cacheBuffer: 0
model: delModel
}
}
}
@@ -0,0 +1,13 @@
CONFIG += testcase
TARGET = tst_qqmldelegatemodel
macos:CONFIG -= app_bundle
QT += qml quick testlib core-private qml-private qmlmodels-private
SOURCES += tst_qqmldelegatemodel.cpp
include (../../shared/util.pri)
TESTDATA = data/*
OTHER_FILES += data/*