Михаиллл
МихаилллJuly 26, 2019, 8:25 p.m.

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

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

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!

15
Pavel K.
  • July 26, 2019, 9 p.m.
  • (edited)

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

    BlinCT
    • July 26, 2019, 9:19 p.m.

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

      Михаиллл
      • July 26, 2019, 9:59 p.m.

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

        Evgenii Legotckoi
        • July 29, 2019, 1:35 p.m.

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

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

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

          Михаиллл
          • July 29, 2019, 1:52 p.m.

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

            Evgenii Legotckoi
            • July 29, 2019, 1:58 p.m.
            • (edited)

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

              Михаиллл
              • July 29, 2019, 2:27 p.m.

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

                Evgenii Legotckoi
                • July 29, 2019, 2:29 p.m.
                • (edited)

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

                  Михаиллл
                  • July 29, 2019, 8:21 p.m.
                  • (edited)

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

                      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.
                    • July 30, 2019, 12:23 p.m.
                    • (edited)

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

                    main () {
                     qmlRegisterType<YourClass>("simple.YourClass", 1, 0, "YourClass");
                    
                     }
                    
                    import simple.YourClass 1.0
                    Page{
                        YourClass{
                        }
                    }
                    
                      Evgenii Legotckoi
                      • July 30, 2019, 12:47 p.m.

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

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

                        Михаиллл
                        • July 30, 2019, 1:06 p.m.
                        • (edited)

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

                          Михаиллл
                          • July 30, 2019, 1:24 p.m.

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

                            Pavel K.
                            • July 30, 2019, 8:28 p.m.
                            • (edited)

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

                              Михаиллл
                              • July 30, 2019, 11:13 p.m.

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

                                Comments

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

                                Qt - Test 001. Signals and slots

                                • Result:84points,
                                • Rating points4
                                Ua

                                Qt - Test 001. Signals and slots

                                • Result:42points,
                                • Rating points-8
                                ОК

                                Qt - Test 001. Signals and slots

                                • Result:47points,
                                • Rating points-6
                                Last comments
                                ИМ
                                Игорь МаксимовNov. 22, 2024, 9:51 p.m.
                                Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                Evgenii Legotckoi
                                Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
                                Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                A
                                ALO1ZEOct. 19, 2024, 5:19 p.m.
                                Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                ИМ
                                Игорь МаксимовOct. 5, 2024, 4:51 p.m.
                                Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                d
                                dblas5July 5, 2024, 8:02 p.m.
                                QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                Now discuss on the forum
                                f
                                firstlunoxodFeb. 15, 2025, 1:46 p.m.
                                Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                                Дмитрий
                                ДмитрийFeb. 3, 2025, 4:24 p.m.
                                Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                                NW
                                Nayo WaiJan. 30, 2025, 7:22 p.m.
                                не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                                n
                                nklyJan. 3, 2025, 12:52 p.m.
                                Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                                M
                                MarselAug. 17, 2023, 12:26 a.m.
                                OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                                Follow us in social networks