alex_lip
alex_lipҚаз. 31, 2018, 8:08 Т.Ж.

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



То есть в зависимости от того какая модель - выводятся соотв. поля. Еще раз повторюсь - на вид все работает. Но мне не нравится то что происходит в логах.











Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

4
Evgenii Legotckoi
  • Қаз. 31, 2018, 9 Т.Ж.

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

root_i.model_name="seaPhones";

view_all_tree.model=seaPhones;

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

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

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




    alex_lip
    • Қаз. 31, 2018, 9:08 Т.Ж.
    • (өңделген)

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

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


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

      Evgenii Legotckoi
      • Қаз. 31, 2018, 9:26 Т.Ж.

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

        alex_lip
        • Қар. 1, 2018, 2:48 Т.Ж.
        • Жауап шешім ретінде белгіленді.

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

          Пікірлер

          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
          Кіріңіз немесе Тіркеліңіз
          Г

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:66ұпай,
          • Бағалау ұпайлары-1
          t

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:33ұпай,
          • Бағалау ұпайлары-10
          t

          Qt - Тест 001. Сигналы и слоты

          • Нәтиже:52ұпай,
          • Бағалау ұпайлары-4
          Соңғы пікірлер
          G
          GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
          Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
          d
          dblas5Шілде 5, 2024, 11:02 Т.Ж.
          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssrАқп. 8, 2024, 6:43 Т.Қ.
          Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          АК
          Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
          Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          Енді форумда талқылаңыз
          Evgenii Legotckoi
          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          F
          FynjyШілде 22, 2024, 4:15 Т.Ж.
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
          BlinCT
          BlinCTМаусым 25, 2024, 1 Т.Ж.
          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
          BlinCT
          BlinCTМамыр 5, 2024, 5:46 Т.Ж.
          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
          Evgenii Legotckoi
          Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

          Бізді әлеуметтік желілерде бақылаңыз