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
                              Evgenii Legotckoi
                              Evgenii LegotckoiOct. 31, 2024, 9:37 p.m.
                              Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZEOct. 19, 2024, 3:19 p.m.
                              Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь МаксимовOct. 5, 2024, 2:51 p.m.
                              Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas5July 5, 2024, 6:02 p.m.
                              QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              k
                              kmssrFeb. 9, 2024, 2:43 a.m.
                              Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              Now discuss on the forum
                              Evgenii Legotckoi
                              Evgenii LegotckoiJune 24, 2024, 10:11 p.m.
                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                              t
                              tonypeachey1Nov. 15, 2024, 2:04 p.m.
                              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                              NSProject
                              NSProjectJune 4, 2022, 10:49 a.m.
                              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                              9
                              9AnonimOct. 25, 2024, 4:10 p.m.
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                              Follow us in social networks