
Динамическая подмена моделей для ListView
Есть ListView для которого я меняю модели, которые заполняю из SqlLite. В принципе все работает, но кое-что непонятно.
Пример - при клике на текущей строке ListView у меня срабатывает следующая функция
MouseArea {
onClicked: { EsdDb.readDataSea_phones(parent_officeid);}
}
где
function readDataSea_phones(m_usersid) { seaPhones.clear(); if(!db) { return; } db.transaction( function(tx) { var sql_text1='select surname, name, middle_name, name_rec, usersid, staffid, name_sokr, officeid, av_path from all_tel where usersid = '+'\'' +m_usersid +'\''; var result = tx.executeSql(sql_text1); for(var i = 0; i < 1; i++) { seaPhones.append({phone:result.rows.item(i).surname+" "+ result.rows.item(i).name+" "+result.rows.item(i).middle_name, tip_n:"" ,usersid: result.rows.item(i).usersid, av_path: result.rows.item(i).av_path}); } } ); db.transaction( function(tx) { var sql_text='select phone, tip_n, usersid from all_phones where usersid = '+'\'' +m_usersid +'\''; var result = tx.executeSql(sql_text); for(var i = 0; i < result.rows.length; i++) { seaPhones.append({phone:result.rows.item(i).phone, tip_n: result.rows.item(i).tip_n, usersid: result.rows.item(i).usersid, av_path: ""}); } } ); root_i.model_name="seaPhones"; view_all_tree.model=seaPhones; }
В этом скрипте я выполняю запрос к базе данных и подменяю текущую модель для ListView на другую. Все работает. Но я в консоле вижу, что QML сначала рефрешит старую модель, а уже затем отображает новую. У меня генерятся ошибки вывода на экран типа qrc:/content/TelSpr.qml:759 : ReferenceError: phone is not defined , и действительно - поле phone у меня описано в той модели, которую я присваиваю в скрипте, А не в той которая текущая была. Но скрипт то отработал. Я вижу по логам, что скрипт отработал, потом ошибки предыдущего отображения, потом нормальный вывод на экран той модели, которую я заполнил в скрипте.
данные модели я вывожу так
Text { id:text_tree padding : 5 width: parent.width renderType: Text.NativeRendering font.pixelSize: dp(19); font.bold: true textFormat: Text.StyledText wrapMode: "Wrap" function model_field(field) { if(field ==='myModel_All_tree'){ return name_office } if(field ==='myModel_All_tel'){ return fio } if(field ==='myModel_All_phones'){ return phone } if(field ==='seaModel_id'){ return name_sokr+" "+name_rec } if(field ==='seaModel'){ return name_sokr+" "+name_rec } if(field ==='seaPhones'){ return phone+" "+tip_n } if(field ==='seaTree'||field ==='seaTree_lvl_1'||field ==='seaTree_lvl_2'||field ==='seaTree_lvl_3'){ return name_office } else { return "" } } text: model_field(root_i.model_name) } }
То есть в зависимости от того какая модель - выводятся соотв. поля. Еще раз повторюсь - на вид все работает. Но мне не нравится то что происходит в логах.

We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Unknown akadamn
- Jan. 24, 2025, 5:14 p.m.
Qt - Test 001. Signals and slots
- Result:84points,
- Rating points4
- Unknown akadamn
- Jan. 24, 2025, 4:22 p.m.
Qt - Test 001. Signals and slots
- Result:42points,
- Rating points-8


Думаю, что проблема вот в этом.
root_i.model_name="seaPhones";
view_all_tree.model=seaPhones;
Вернее в местоположении этих строчек.
Сначала установите имя модели, а потом уже данные с полем phone начинайте добавлять. Скорее всего перерисовка выпонляется при каждом добавлении данных в таблицу, то есть при каждом append .
А вообще, не хорошо в представлении писать невалидные поля. Благо, что это JavaScript.
пробовал. В этом случае сначала идет рефреш старой модели, потом скрипт, потом отображение новой. Но ошибки из-за рефреша все равно идут.
То есть похоже рефреш происходит в момент выполнения функции view_all_tree.model=seaPhones;
В принципе я могу все модели привести к набору одинаковых полей. Тогда ошибок не будет. Но почему происходит рефреш ListView с привязкой к старой модели, когда там уже новые данные. Вот вопрос
Я бы ещё попробовал написать или два разных представления, или два разных делегате, и менял бы делегаты в зависимости от устанавливаемой модели.
В делегатах слишком много кода. Я просто понаписал фиктивных полей в моделей - чтобы не было ошибок. И все оставил как есть.