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

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

                              Комментарии

                              Только авторизованные пользователи могут публиковать комментарии.
                              Пожалуйста, авторизуйтесь или зарегистрируйтесь
                              AD

                              C++ - Тест 004. Указатели, Массивы и Циклы

                              • Результат:50баллов,
                              • Очки рейтинга-4
                              m
                              • molni99
                              • 26 октября 2024 г. 1:37

                              C++ - Тест 004. Указатели, Массивы и Циклы

                              • Результат:80баллов,
                              • Очки рейтинга4
                              m
                              • molni99
                              • 26 октября 2024 г. 1:29

                              C++ - Тест 004. Указатели, Массивы и Циклы

                              • Результат:20баллов,
                              • Очки рейтинга-10
                              Последние комментарии
                              i
                              innorwall11 ноября 2024 г. 22:12
                              Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                              i
                              innorwall11 ноября 2024 г. 18:23
                              QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                              i
                              innorwall11 ноября 2024 г. 15:50
                              Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                              i
                              innorwall11 ноября 2024 г. 14:19
                              Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                              i
                              innorwall11 ноября 2024 г. 13:55
                              PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                              Сейчас обсуждают на форуме
                              i
                              innorwall11 ноября 2024 г. 20:56
                              добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                              i
                              innorwall11 ноября 2024 г. 10:55
                              Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                              9
                              9Anonim25 октября 2024 г. 9:10
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                              ИМ
                              Игорь Максимов3 октября 2024 г. 4:05
                              Реализация навигации по разделам Спасибо Евгений!

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