alex_lip
alex_lip8 декабря 2017 г. 17: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 г. 18:04

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

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

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

      alex_lip
      • 8 декабря 2017 г. 19: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 г. 19:22

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

          alex_lip
          • 8 декабря 2017 г. 19: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 г. 19:30
            • (ред.)

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

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

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

                alex_lip
                • 11 декабря 2017 г. 12: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 г. 14:08
                  • Ответ был помечен как решение.

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

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

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

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

                  В том же топике предлагается решение с методом getRecord, который возвращает объект, который содержит всю информацию о записи (строке в таблице).
                    alex_lip
                    • 11 декабря 2017 г. 14: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 г. 14:28

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

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

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

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

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

                              Комментарии

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

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

                              • Результат:84баллов,
                              • Очки рейтинга4
                              Ua

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

                              • Результат:42баллов,
                              • Очки рейтинга-8
                              ОК

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

                              • Результат:47баллов,
                              • Очки рейтинга-6
                              Последние комментарии
                              ИМ
                              Игорь Максимов22 ноября 2024 г. 21:51
                              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                              Evgenii Legotckoi
                              Evgenii Legotckoi31 октября 2024 г. 23:37
                              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZE19 октября 2024 г. 17:19
                              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь Максимов5 октября 2024 г. 16:51
                              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas55 июля 2024 г. 20:02
                              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              Сейчас обсуждают на форуме
                              f
                              firstlunoxod15 февраля 2025 г. 13:46
                              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                              Дмитрий
                              Дмитрий3 февраля 2025 г. 16:24
                              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                              NW
                              Nayo Wai30 января 2025 г. 19:22
                              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                              n
                              nkly3 января 2025 г. 12:52
                              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                              M
                              Marsel17 августа 2023 г. 0:26
                              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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