alex_lip
alex_lipDec. 8, 2017, 6:46 a.m.

Как значение текущего элемента 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)
           }





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!

14
Evgenii Legotckoi
  • Dec. 8, 2017, 7:04 a.m.

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

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

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

      alex_lip
      • Dec. 8, 2017, 8:17 a.m.

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

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

        Evgenii Legotckoi
        • Dec. 8, 2017, 8:22 a.m.

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

          alex_lip
          • Dec. 8, 2017, 8:27 a.m.
          • (edited)

          самописная


          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
            • Dec. 8, 2017, 8:30 a.m.
            • (edited)

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

              alex_lip
              • Dec. 8, 2017, 8:31 a.m.

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

                alex_lip
                • Dec. 11, 2017, 1:02 a.m.

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

                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
                  • Dec. 11, 2017, 3:08 a.m.
                  • The answer was marked as a solution.

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

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

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

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

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

                    У меня метод 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
                      • Dec. 11, 2017, 3:28 a.m.

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

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

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

                            Evgenii Legotckoi
                            • Dec. 11, 2017, 4:11 a.m.

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

                              Comments

                              Only authorized users can post comments.
                              Please, Log in or Sign up
                              AD

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:50points,
                              • Rating points-4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:80points,
                              • Rating points4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:20points,
                              • Rating points-10
                              Last comments
                              i
                              innorwallNov. 14, 2024, 7:03 a.m.
                              How to make game using Qt - Lesson 3. Interaction with other objects what is priligy tablets What happens during the LASIK surgery process
                              i
                              innorwallNov. 14, 2024, 4:09 a.m.
                              Using variables declared in CMakeLists.txt inside C ++ files where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
                              i
                              innorwallNov. 12, 2024, 6:12 a.m.
                              Django - Tutorial 055. How to write auto populate field functionality Freckles because of several brand names retin a, atralin buy generic priligy
                              i
                              innorwallNov. 12, 2024, 2:23 a.m.
                              QML - Tutorial 035. Using enumerations in QML without 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
                              innorwallNov. 11, 2024, 11:50 p.m.
                              Qt/C++ - Lesson 052. Customization Qt Audio player in the style of 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…
                              Now discuss on the forum
                              i
                              innorwallNov. 14, 2024, 8:39 a.m.
                              добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
                              i
                              innorwallNov. 11, 2024, 6:55 p.m.
                              Всё ещё разбираюсь с кешем. 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
                              9AnonimOct. 25, 2024, 4:10 p.m.
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                              Follow us in social networks