Динамическая подмена моделей для 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)
- }
- }
То есть в зависимости от того какая модель - выводятся соотв. поля. Еще раз повторюсь - на вид все работает. Но мне не нравится то что происходит в логах.
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Думаю, что проблема вот в этом.
root_i.model_name="seaPhones";
view_all_tree.model=seaPhones;
Вернее в местоположении этих строчек.
Сначала установите имя модели, а потом уже данные с полем phone начинайте добавлять. Скорее всего перерисовка выпонляется при каждом добавлении данных в таблицу, то есть при каждом append .
А вообще, не хорошо в представлении писать невалидные поля. Благо, что это JavaScript.
пробовал. В этом случае сначала идет рефреш старой модели, потом скрипт, потом отображение новой. Но ошибки из-за рефреша все равно идут.
То есть похоже рефреш происходит в момент выполнения функции view_all_tree.model=seaPhones;
В принципе я могу все модели привести к набору одинаковых полей. Тогда ошибок не будет. Но почему происходит рефреш ListView с привязкой к старой модели, когда там уже новые данные. Вот вопрос
Я бы ещё попробовал написать или два разных представления, или два разных делегате, и менял бы делегаты в зависимости от устанавливаемой модели.
В делегатах слишком много кода. Я просто понаписал фиктивных полей в моделей - чтобы не было ошибок. И все оставил как есть.