2017-01-31 6 views
0

Я пытаюсь реализовать функцию обратного вызова в моем QML ListModel для выполнения некоторых операций при изменении данных внутри ListModel. По-видимому, это невозможно создать ... Изменены обработчики для отдельных пользовательских свойств в ListModel. Итак, я пытаюсь использовать обработчик onDataChanged, доступный для ListModel.QML ListModel onDataChanged issues

ListModel { 
    id: model 

    onDataChanged: { 
     console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get(bottomRight).val) 
    } 
} 

Однако onDataChanged только когда-либо, кажется, ссылается на самый первый элемент в ListModel. То есть, topLeft и bottomRight всегда указывают на первый элемент, даже когда я манипулирую элементом вниз по списку.

Здесь мне нужен надежный обработчик, который точно отражает правильную строку в ListModel, когда он срабатывает.

+0

Если вы используете [универсальную объектную модель] (http://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use-in-qml/35161903#35161903), вы можете использовать регулярные свойства с отдельными уведомлениями об изменении. – dtech

+0

Невозможно из-за ограничений проекта. Почему onDataChanged возвращает первую строку при манипулировании другой строкой? Я просто неправильно использую эти параметры? – user1765354

+0

Аргументами 'QAbstractItemModel :: dataChanged()' являются 'QModelIndex', то есть объекты типа класса. Вы передаете их функциям, ожидающим целых чисел, среда JavaScript, скорее всего, совершит одно из своих магических преобразований. Использование ListModel для данных, изменение которых является нечетным, обычно указывает, что правильная пользовательская модель будет лучше. –

ответ

0

Когда я изменяю данные в ListModel, все кажется правильным. Попробуйте этот пример:

Window { 
    id: mainWindow 
    visible: true 
    width: 1200 
    height: 800 

    ListModel { 
     id: lm 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 

     onDataChanged: console.log('Data Changed', topLeft.row, get(topLeft.row).test, data(topLeft, roles[0])) 
    } 

    ListView { 
     width: 200 
     height: 800 
     model: lm 
     delegate: Button { 
      text: model.test 
      onClicked: model.test++ 
     } 
    } 
} 

QML- get -функции ожидает целое число, указывающее индекс, который соответствует QModelIndex.row. Отметьте, что в QML у вас есть строка как свойство, поэтому .row() не удастся.

В качестве альтернативы можно использовать метод data(index, role). Это значение принимает QModelIndex как индекс, а role - как целое. Мне повезло, так как я не знаю, как отказаться от сопоставления из целочисленных ролей, предоставляемых сигналом, в roleName, которые обычно используются в QML.

Смежные вопросы