alex_lip
alex_lipOct. 31, 2018, 8:08 a.m.

Динамическая подмена моделей для 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
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!

4
Evgenii Legotckoi
  • Oct. 31, 2018, 9 a.m.

Думаю, что проблема вот в этом.

root_i.model_name="seaPhones";

view_all_tree.model=seaPhones;

Вернее в местоположении этих строчек.

Сначала установите имя модели, а потом уже данные с полем phone начинайте добавлять. Скорее всего перерисовка выпонляется при каждом добавлении данных в таблицу, то есть при каждом append .

А вообще, не хорошо в представлении писать невалидные поля. Благо, что это JavaScript.




    alex_lip
    • Oct. 31, 2018, 9:08 a.m.
    • (edited)

    пробовал. В этом случае сначала идет рефреш старой модели, потом скрипт, потом отображение новой. Но ошибки из-за рефреша все равно идут. 

    То есть похоже рефреш происходит в момент выполнения функции view_all_tree.model=seaPhones;


    В принципе я могу все модели привести к набору одинаковых полей. Тогда ошибок не будет. Но почему происходит рефреш ListView с привязкой к старой модели, когда там уже новые данные. Вот вопрос

      Evgenii Legotckoi
      • Oct. 31, 2018, 9:26 a.m.

      Я бы ещё попробовал написать или два разных представления, или два разных делегате, и менял бы делегаты в зависимости от устанавливаемой модели.

        alex_lip
        • Nov. 1, 2018, 2:48 a.m.
        • The answer was marked as a solution.

        В делегатах слишком много кода. Я просто понаписал фиктивных полей в моделей - чтобы не было ошибок. И все оставил как есть.

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          e
          • ehot
          • March 31, 2024, 11:29 a.m.

          C++ - Тест 003. Условия и циклы

          • Result:78points,
          • Rating points2
          B

          C++ - Test 002. Constants

          • Result:16points,
          • Rating points-10
          B

          C++ - Test 001. The first program and data types

          • Result:46points,
          • Rating points-6
          Last comments
          k
          kmssrFeb. 8, 2024, 3:43 p.m.
          Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          EVA
          EVADec. 25, 2023, 7:30 a.m.
          Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
          J
          JonnyJoDec. 25, 2023, 5:38 a.m.
          Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
          G
          GvozdikDec. 18, 2023, 6:01 p.m.
          Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
          Now discuss on the forum
          G
          GarApril 22, 2024, 2:46 a.m.
          Clipboard Как скопировать окно целиком в clipb?
          DA
          Dr Gangil AcademicsApril 20, 2024, 4:45 a.m.
          Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
          a
          a_vlasovApril 14, 2024, 3:41 a.m.
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
          Павел Дорофеев
          Павел ДорофеевApril 13, 2024, 11:35 p.m.
          QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
          f
          fastrexApril 4, 2024, 1:47 a.m.
          Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

          Follow us in social networks