alex_lip
alex_lip8 декабря 2017 г. 6:46

Как значение текущего элемента ListView получить вне ListView

Есть ListView  - в нем список элементов. Как значение текущего элемента ListView получить вне ListView?
Пытаюсь сделать так - объявил property - затем по клику на элементе ListView присваиваю этому property значение текущего элемента. Все хорошо. Но как найти значение первого элемента при открытии ListView ?
Или какой еще есть способ?

property string id_file: ""
ListView {
          id: view_file
          model: myModel_file
          highlight: Rectangle {
                               color: "orange"
                               width: 4
                               radius: 5
                                }
                 delegate: Item {
                                 id: listDelegateFile
                                 property var view: ListView.view_file
                                 property var isCurrent: ListView.isCurrentItem
                                 width: view_file.width
                                 height: text_file.implicitHeight + 4
                                 Rectangle {
                                              anchors.margins: 1
                                              anchors.fill: parent
                                              radius: 5
                                              color: isCurrent ? "lightgreen" : "ivory"
                                              border {
                                                   color: "orange"
                                                   width: 1
                                               }
                                               Text {
                                                   id:text_file
                                                   anchors.centerIn: parent
                                                   font.pointSize: 12; font.bold: true
                                                   textFormat: Text.StyledText
                                                   width: view_file.width
                                                   padding : 10
                                                   wrapMode: "Wrap"
             text:"<font color='black'><strong>"+name_doc+"</stron></font>" +" от " +"<font color='black'><em>"+date_izm+"</em></font>"
                                           }
MouseArea {
anchors.fill: parent
onClicked:
  {
  view_file.currentIndex = model.index
  id_file=file_docid
             }
//----------------
TextButton {
           id: v_file
           anchors.bottom: parent.bottom
           anchors.left: parent.left
           width: parent.width/2-1
           text:"Открыть"
           smooth: false
           onClicked: appCore.p_image(id_file)
           }





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

Вам это нравится? Поделитесь в социальных сетях!

14
Evgenii Legotckoi
  • 8 декабря 2017 г. 7:04

Вообще, значение первого элемента в модели данных, можно найти через саму модель данных. А первый элемент можно взять и по обращению через index

myModel_file->get(0)
А что касается внешнего доступа к ListView внутри какого-то вашего ползовательского типа, то киньте alias на этот ListView
property alias myListView: view_file
И получите возможность полного доступа к ListView извне
    alex_lip
    • 8 декабря 2017 г. 7:47

    Сделал как вы сказали. У меня  myListView внутри dialog_file (диалог)
    пытаюсь получить чего-нибудь вот так - dialog_file.myListView.currentItem.data   -  получил некие объекты [object Object] - не знаю что с ними делать.
    На самом деле мне нужен текущий элемент модели myModel_file - поле file_docid

      alex_lip
      • 8 декабря 2017 г. 8:17

      Пытаюсь сделать так
      console.log(myModel_file.get(0).file_docid)

      Пишет
      TypeError: Property 'get' of object Sp_fileModel(0x28fd60) is not a function

        Evgenii Legotckoi
        • 8 декабря 2017 г. 8:22

        Погодите... А эта модель самописная (наследованная от QAbstractItemModel)? или всё-таки это ListModel? (которая QML ListModel)

          alex_lip
          • 8 декабря 2017 г. 8:27
          • (ред.)

          самописная


          class Sp_fileModel : public QAbstractListModel

          {
              Q_OBJECT
          public:
              enum Sp_fileRoles {
                  doc_idRole = Qt::UserRole + 1,
                  file_docidRole, name_docRole, date_izmRole
              };
              Sp_fileModel(QObject *parent = 0);
          //![1]

              void addSp_file(const Sp_file &Sp_file);
              int rowCount(const QModelIndex & parent = QModelIndex()) const;
              QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
              void clearSp_file();

          protected:
              QHash<int, QByteArray> roleNames() const;
          private:
              QList<Sp_file> m_Sp_file;
          //![2]
          };
          //![2]

            Evgenii Legotckoi
            • 8 декабря 2017 г. 8:30
            • (ред.)

            ммм.. тогда нужно реализовать метод get ))) и сделать его как Q_INVOKABLE. Нужен какой-то метод,  который вернёт вам нужное значение.

              alex_lip
              • 8 декабря 2017 г. 8:31

              спасибо. попробую.

                alex_lip
                • 11 декабря 2017 г. 1:02

                У меня в модели описана функция доступа по индексу

                QVariant Sp_fileModel::data(const QModelIndex & index, int role) const {
                    if (index.row() < 0 || index.row() >= m_Sp_file.count())
                        return QVariant();
                
                    const Sp_file &Sp_file = m_Sp_file[index.row()];
                 if (role == doc_idRole)
                        return Sp_file.doc_id();
                  else if (role == file_docidRole)
                        return Sp_file.file_docid();
                 else if (role == name_docRole)
                       return Sp_file.name_doc();
                 else if (role == date_izmRole)
                       return Sp_file.date_izm();
                    return QVariant();
                }
                
                //![0]
                QHash<int, QByteArray> Sp_fileModel::roleNames() const {
                    QHash<int, QByteArray> roles;
                    roles[doc_idRole] = "doc_id";
                    roles[file_docidRole] = "file_docid";
                    roles[name_docRole] = "name_doc";
                    roles[date_izmRole] = "date_izm";
                    return roles;
                }
                вот здесь пишут https://stackoverflow.com/questions/20398646/qml-model-data-by-index - что в этом случае ее не надо объявлять Q_INVOKABLE
                Однако в QML  в процедуре Component.onCompleted: {
                                                               console.log("file_docid: " + myModel_file.data(0,3));
                                                       }
                пишет qml: file_docid: undefined
                Component.onCompleted: находится внутри delegate: Item {


                  Evgenii Legotckoi
                  • 11 декабря 2017 г. 3:08
                  • Ответ был помечен как решение.

                  В том топике сказано, что эти роли берутся в рамках делегата. Вне не будет работать. В рамках делегата подставновка идёт по стороковым именам ролей, которые формируются в методе roleNames()

                  Поэтому вовне и идёт как undefined.

                  Что касается Q_INVOKABLE, то я бь и тоже не помечал метод data().

                  Более адекватным вариантом решения задаче является, как я и говорил выше создание специального метода, который вернёт необходимую инофрмацию. А то, что там дан метод data, и который вы использовали в onCompleted и к слову аобсолютно неправильно, то в том топике был написан свой кастомный метод data, который принимает целочисленные аргументы, тогда как в обычно методе data один из аргументов является QModelIndex.

                  В том же топике предлагается решение с методом getRecord, который возвращает объект, который содержит всю информацию о записи (строке в таблице).
                    alex_lip
                    • 11 декабря 2017 г. 3:26

                    У меня метод onCompleted внутри делегата.
                    Я сделал примитивно - объявил две глобальные переменные
                    property int temp_k: 0
                    property string id_file: ""

                    и в методе

                    Component.onCompleted: {
                                            if (temp_k===0)
                                            {
                                              id_file=file_docid;
                                              temp_k=1;
                                             }
                                            }
                    Таким образом в глобальной переменной
                    id_file
                    при открытии формы оказывается первый элемент . При закрытии диалога - я temp_k - обнуляю.
                    Я понял - что более правильно создать свой метод, который вернет то что нужно.
                    Но это для меня не так просто. Будет время - попробую.   Спасибо!

                      alex_lip
                      • 11 декабря 2017 г. 3:28

                      А какие значения у QModelIndex ? Это не порядковый номер элемента?

                        Evgenii Legotckoi
                        • 11 декабря 2017 г. 3:50
                        QModelIndex - это целый класс, который несёт в себе достаточно приличный объём информации. В том числе и указатель на саму модель данных. А также несколько методов, неоторые из которых обеспечивают навигацию по модели и организацию древовидной структуры, если требуется. Так что считать его только порядковым номером - это ошибочно.
                         
                        Вот внутри onCompleted метода делегата роли будут работать. Поэтому в делегате у вас работает file_docid.
                         
                        Что касается объявления нового метода, то принципиально ничего сложного не должно быть. Посмотрите вот эту статью и обратите внимание на метод getId() , это то, что вам нужно. Там метод объявлен как слот, но можно объявить как Q_INVOKABLE, разница лишь в том, требуется ли работа метода в качестве слота... (по факту не требуется)
                          alex_lip
                          • 11 декабря 2017 г. 3:59

                          Вот реально огромное спасибо!! У вас большое терпение с нами возиться и отзывчивость.

                            Evgenii Legotckoi
                            • 11 декабря 2017 г. 4:11

                            Пожалуйста ))

                              Комментарии

                              Только авторизованные пользователи могут публиковать комментарии.
                              Пожалуйста, авторизуйтесь или зарегистрируйтесь
                              e
                              • ehot
                              • 31 марта 2024 г. 11:29

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

                              • Результат:78баллов,
                              • Очки рейтинга2
                              B

                              C++ - Тест 002. Константы

                              • Результат:16баллов,
                              • Очки рейтинга-10
                              B

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

                              • Результат:46баллов,
                              • Очки рейтинга-6
                              Последние комментарии
                              k
                              kmssr8 февраля 2024 г. 15:43
                              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              АК
                              Анатолий Кононенко4 февраля 2024 г. 22:50
                              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                              EVA
                              EVA25 декабря 2023 г. 7:30
                              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                              J
                              JonnyJo25 декабря 2023 г. 5:38
                              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                              G
                              Gvozdik18 декабря 2023 г. 18:01
                              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                              Сейчас обсуждают на форуме
                              a
                              a_vlasov14 апреля 2024 г. 3:41
                              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                              Павел Дорофеев
                              Павел Дорофеев13 апреля 2024 г. 23:35
                              QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                              f
                              fastrex4 апреля 2024 г. 1:47
                              Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                              P
                              Pisych27 февраля 2023 г. 1:04
                              Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                              AC
                              Alexandru Codreanu19 января 2024 г. 8:57
                              QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                              Следите за нами в социальных сетях