Михаиллл
Михаиллл26 июля 2019 г. 20:25

Можно ли в Qt WebView из с++ слоя перенести в qml?

Добрый день.
Можно ли в Qt WebView из с++ слоя перенести в qml? т.к. в qml он урезан

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

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

15
Pavel K.
  • 26 июля 2019 г. 21:00
  • (ред.)

На плюсах пишется логика, в qml - делается отображение(модель)
Вы хотите всю логику писать в qml ?
Можно логику писать и в плюсах и в qml , разница лишь в том что вам не придется лопатить целые страницы qml чтобы что-то исправить (достаточно что-то в плюсах поменять), также логику с плюсами используют когда нужно динамически обьекты создавать на форме(к примеру).Посмотрите пожалуйста паттерны программирования MVC, MVP, MVVM , вам сразу все станет понятно.

    BlinCT
    • 26 июля 2019 г. 21:19

    Очень странное желание логику переносить в qml. Qml тем хорошо что это чистый frontend а кресты это логика. Зачем это менять не понимаю.

      Михаиллл
      • 26 июля 2019 г. 21:59

      Просто у WebView в с++ есть больше сигналов, в частности мне нужен сигнал о необходимости загрузки файла. В qml такого нет.

        Evgenii Legotckoi
        • 29 июля 2019 г. 13:35

        У меня вот есть мысль, что здесь есть только один способ.
        Слушать сигнал loadingChanged(loadRequest)

        А и того loadRequest брать url и смотреть на его расширение. Если расширение совпадает с расширением файла, то попытаться скачать, если похоже на страницу, то тогда отправить запрос на открытие новой странице. Довольно тупой подход, но иного я не нашёл.

        Правда я ещё не смотрел исходники QQuickWebView, вполне возможно, что там могут быть сигналы, которые не описаны в документации. В том числе и сигнал на скачивание файла.

          Михаиллл
          • 29 июля 2019 г. 13:52

          Пробую так дедалать, но пока касячно выходит. По одной из ошибок иногда можно определить ссылку для скачивания, иногда по расширению файла, но иногда кое-что не понятно как скачивать.
          Посмотрите пожалуйста, может быть все же есть какие-то другие сигналы, кроме loadingChanged

            Evgenii Legotckoi
            • 29 июля 2019 г. 13:58
            • (ред.)

            Я не нашёл других сигналов в документации, надо смотреть исходники QQuickWebView. Если там что-то другое будет в секции signals, то значит это можно ииспользовать и в QML.

              Михаиллл
              • 29 июля 2019 г. 14:27

              А как это сделать?

                Evgenii Legotckoi
                • 29 июля 2019 г. 14:29
                • (ред.)

                Скачать исходники, открыть файл qquickwebview.h, посмотреть. Исходники можно скачать и в Maintenance Tool

                  Михаиллл
                  • 29 июля 2019 г. 20:21
                  • (ред.)

                  Есть такие сигналы, может быть знаете, как их можно определить для определения необходимости загрузки

                      void titleChanged();
                      void urlChanged();
                      Q_REVISION(1) void loadingChanged(QQuickWebViewLoadRequest *loadRequest);
                      void loadProgressChanged();
                  

                  а еще есть такое

                  Q_SLOTS:
                      void onRunJavaScriptResult(int id, const QVariant &variant);
                      void onFocusRequest(bool focus);
                      void onLoadingChanged(const QWebViewLoadRequestPrivate &loadRequest);
                  
                    Pavel K.
                    • 30 июля 2019 г. 12:23
                    • (ред.)

                    можно протащить методы с++ в qml как компонент

                    main () {
                     qmlRegisterType<YourClass>("simple.YourClass", 1, 0, "YourClass");
                    
                     }
                    
                    import simple.YourClass 1.0
                    Page{
                        YourClass{
                        }
                    }
                    
                      Evgenii Legotckoi
                      • 30 июля 2019 г. 12:47

                      Не думаю, что это поможет. Обычный QWebView, который нужен топикстартеру, вряд ли получится протащить так просто. Классические виджеты вообще в QML не протаскиваются (обратный вариант возможен, то есть QQuickItem отобразить в QWidget, а вот наоборот уже нет, вырезали поддержку).

                      Ищ всего выше сказанного предполагаю, что придётся топикстартеру разбираться с определением того есть, то есть с тем скудным набором сигналов, который есть в QML WebView

                        Михаиллл
                        • 30 июля 2019 г. 13:06
                        • (ред.)

                        А можно ли в нынешних версиях Qt создовать в с++ слое WebView, я попытался, но проект не запустился?
                        Выдает ошибку :dependent 'qtwebview.h' does not exist.

                          Михаиллл
                          • 30 июля 2019 г. 13:24

                          Вот по этой ссылке открываю картинку на телефоне, там есть кнопка скачать, а мне возвращаает url страницы с картинками. И не возвращает ошибок.
                          https://yandex.ru/search/touch/?text=иконка крест&lr=10765&mda=0
                          А оно должно выдавать сигнал и ссылку на скачивание.
                          Встроенными сигналами это не решеить.
                          Может быть у веб вью есть какая-либо характеристика, типа ссылки на скачиание?

                            Pavel K.
                            • 30 июля 2019 г. 20:28
                            • (ред.)

                            кст есть еще setContextProperty и синглтоны , вот вам наглядный пример

                            #include<YourClass>
                            main(){
                            QScopedPointer<QQuickView> view(someWidget(QWidget etc.)::createView());
                            
                                ViewNavigator::instance().setRootContext(view->rootContext());
                                view->rootContext()->setContextProperty("YourClass", &YourClass::instance()); // через инстанс обращение
                            
                                view->setSource(someWidget(QWidget etc.)::pathToMainQml());
                                view->show();
                            }
                            
                            YourClass.h
                            #include <..>
                            #include <Macros.h>
                            
                            class YourClass {
                            private:
                                YourClass();
                                ~YourClass() = default;
                            
                            public:
                                SINGLETON(YourClass)
                            /* Properties */
                            public:
                            private:
                            //   etc.
                            }
                            
                            Macros.h
                            #pragma once
                            #include <QString>
                            
                            #define SINGLETON(x) static x& instance() { static x s; return s; }
                            

                            а в QML уже можно напрямую в свойстве вызывать :

                            Container{
                            yourProperty: YourClass.someMethod()
                            }
                            

                            грубо говоря, с помощью setContextProperty к классу можно обращяться из любой точки программы

                              Михаиллл
                              • 30 июля 2019 г. 23:13

                              Это замечательно. Но как это может в решении вопроса с получением сигнала на скачивание у вебВью?

                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                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 Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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