Михаиллл
МихаилллJuly 26, 2019, 10:25 a.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, 11 a.m.
  • (edited)

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

    BlinCT
    • July 26, 2019, 11:19 a.m.

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

      Михаиллл
      • July 26, 2019, 11:59 a.m.

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

        Evgenii Legotckoi
        • July 29, 2019, 3:35 a.m.

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

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

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

          Михаиллл
          • July 29, 2019, 3:52 a.m.

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

            Evgenii Legotckoi
            • July 29, 2019, 3:58 a.m.
            • (edited)

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

              Михаиллл
              • July 29, 2019, 4:27 a.m.

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

                Evgenii Legotckoi
                • July 29, 2019, 4:29 a.m.
                • (edited)

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

                  Михаиллл
                  • July 29, 2019, 10:21 a.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, 2:23 a.m.
                    • (edited)

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

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

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

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

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

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

                          Михаиллл
                          • July 30, 2019, 3:24 a.m.

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

                            Pavel K.
                            • July 30, 2019, 10:28 a.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, 1:13 p.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
                                ИМ
                                Игорь МаксимовNov. 22, 2024, 10:51 p.m.
                                Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                Evgenii Legotckoi
                                Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
                                Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                A
                                ALO1ZEOct. 19, 2024, 6:19 p.m.
                                Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                ИМ
                                Игорь МаксимовOct. 5, 2024, 5:51 p.m.
                                Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                d
                                dblas5July 5, 2024, 9: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
                                Evgenii Legotckoi
                                Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                t
                                tonypeachey1Nov. 15, 2024, 5:04 p.m.
                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                NSProject
                                NSProjectJune 4, 2022, 1:49 p.m.
                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                9
                                9AnonimOct. 25, 2024, 7:10 p.m.
                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                Follow us in social networks