QWebView에서 QWebEngineView로

8508 단어 qt
  • vs 2013의 Qt5 플러그인은 Qt Project Settings에서 QWeb Engine View와 QWeb Channel을 도입할 수 있는 모듈이 없습니다. 우리는 vs 2013에서 수동으로 가입할 수 있습니다.추가 포함 디렉토리: (QTDIR)\include\QtWebEngineWidgets, (QTDIR)\include\QtWebChannel 추가 의존항:Qt5WebEngineWidgetsd.lib, Qt5WebChanneld.lib
  • page()->mainFrame()->evaluateJavaScript(str); => page()->runJavaScript(str);
  • QWebSettings => QWebEngineSettings
  • QWebHistory => QWebEngineHistory
  • page()->mainFrame()->load => page()->load
  • Incorrect warning MSB8027 reported for files excluded from build
    vs2013 업데이트 5로 업데이트하거나 텍스트 편집기에서 프로젝트 삽입을 엽니다: IgnoreWarn Compile Duplicated Filename...true...
  • evaluateJavaScript => runJavaScript
  • evaluateJavaScript 반환값 => 비동기 리셋을 사용하여 [] (const QVariant &val) {}
  • 수락
  • QWebEngineView 배경색 설정=>page()->setBackgroundColor(QColor("#0f0f10"))
  • Qt WebEngine ICU data not found The application MAY NOT work. Installed Qt WebEngine locales directory not found at location = > resources와translations 디렉터리를 추가합니다. 구체적인 위치는 로그 어디에서 찾을 수 있는지 qt.conf 파일을 사용하여 경로를 구성합니다
  • .
  • QWebEngineView 디버깅
    방법1:html에 가입https://getfirebug.com/firebug-lite.js, 페이지에서 F12를 누르면 디버깅 패널을 열 수 있습니다. 단점: 이 js 파일은 비교적 커서 불러올 때 효율에 영향을 줍니다.기능이 제한되어 있다.방법2: 프로그램을 시작할 때 qputenv("QTWEBENGINE REMOTE DEBUGGGING", 9000)를 열고 크롬에서 웹 주소를 열면localhost:9000에서 QWebEngineView가 불러온 html을 볼 수 있습니다. 해당하는 html을 클릭하면 크롬의 개발자 도구를 열 수 있습니다.이 방법은 위의 것보다 훨씬 좋다.
  • linkClicked(QUrl)QWebEnginePage 리셋 acceptNavigationRequest 인터페이스
  • bool WebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame)
    {
        if (isMainFrame) {
            if (NavigationTypeLinkClicked == type) {
                emit sigLoadUrl(url);
                return false;
            }
        }
        return true;
    }
  • 런자바스크립트 결과를 동시 반환하고 조심스럽게 사용
  • QPair<bool, QVariant> syncRunJavaScript(QWebEnginePage *page, const QString &javascript, int msec) 
    {
         QPair<bool, QVariant> result = qMakePair(false, 0);
         QSharedPointer loop = QSharedPointer(new QEventLoop());
         QTimer::singleShot(msec, loop.data(), &QEventLoop::quit);
         page->runJavaScript(javascript, [loop, &result](const QVariant &val) {
             if (loop->isRunning()) {
                 result.first = true;
                 result.second = val;
                 loop->quit();
             }
         });
         loop->exec();
         return result;
     }

    QWebEngineView 리셋 함수 contextMenuEvent에서 호출할 수 없습니다!runJavaScript 콜백에서 장시간 작업을 수행할 수 없습니다. 그렇지 않으면 JavaScript 코드가 다음과 같이 실행되지 않습니다.
    page()->runJavaScript("script", [](const QVariant &val) {
        // ...
        menu.exec(QCursor::pos());
    }

    해결 방법은 신호와 슬롯 함수를 정의하고QueuedConnection방식connect를 사용하여 slotJavaScriptResult에서 시간 소모 작업을 처리합니다.
    connect(this, &webview::sigJavaScriptResult, this, &webview::slotJavaScriptResult, Qt::QueuedConnection);
    void sigJavaScriptResult(const QString &command, const QVariantMap &result);
    void slotJavaScriptResult(const QString &command, const QVariantMap &result);
  • runJavaScript 타이밍
  • connect(this->page(), SIGNAL(loadFinished(bool)), this, SLOT(finish(bool)));
  • js 호출 C++ 타이밍
  • window.cppobj = null;
    new QWebChannel(qt.webChannelTransport, function(channel) {
      window.cppobj = channel.objects.cppobj;
      cppobj.init(); //   C++     
    });
  • 웹 페이지, 마우스 오른쪽 단추로 클릭한 요소
    function contextMenu(e) {
    var targ;
    if (!e) {
    var e = window.event;
    }
    if (e.target) {
    targ = e.target;
    } else if (e.srcElement) {
    targ = e.srcElement;
    }
    }
    
  • 웹 페이지, 선택한 html
  • 가져오기
     function getHTMLOfSelection () {
      var range;
      if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        return range.htmlText;
      }
      else if (window.getSelection) {
        var selection = window.getSelection();
        if (selection.rangeCount > 0) {
          range = selection.getRangeAt(0);
          var clonedSelection = range.cloneContents();
          var div = document.createElement('div');
          div.appendChild(clonedSelection);
          return div.innerHTML;
        }
        else {
          return '';
        }
      }
      else {
        return '';
      }
    }
  • QWebEngineView 수신drop 이벤트
  •   setAcceptDrops(true);    ,     :
    void webview::dragEnterEvent(QDragEnterEvent *event)
    {
        event->accept();
        QWebEngineView::dragEnterEvent(event);
    }
        void webview::dropEvent(QDropEvent * event)
  • 웹 인쇄 로그는 QWebEnginePage의javaScriptConsoleMessage 함수를 다시 불러오는 데 매우 유용하며 js가 인쇄한 로그(예를 들어:console.log)를 받을 수 있다.
  • QWebEnginePage 1개QtWebEngineProcess.exe 프로세스입니다. 따라서 웹 페이지 창이 표시되지 않을 때는 삭제하고 숨기지 않는 것이 좋습니다.
  • 일부 기기의 QWebEngineView 내용이 표시되지 않는 것은 배경색 설정과 관련이 있을 수 있습니다.
  • js와 c++ 사이의 호환 반환값 처리QWebEngineView에서 c++가 js 코드를 호출하는 것은 비동기적인 리셋을 통해 얻을 수 있다.js가 c++ 함수를 호출하면 c++ 함수의 반환 값을 얻을 수 없습니다. c++를 통해 js에게 신호를 보내서 반환할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기