Qt WebKit에서 Qt WebEngine

다음 섹션에는 Qt WebKit QWebView API를 사용하는 애플리케이션을 포팅하는 방법에 대한 정보가 포함되어 있습니다. Qt WebEngine QWebEngineView.

아키텍처

Chromium은 Qt WebEngine 에서 사용하는 자체 네트워크 및 페인팅 엔진을 제공합니다. 이는 무엇보다도 Qt WebEngine 이 최신 HTML5 사양을 Qt WebKit보다 더 안정적으로 지원할 수 있게 해줍니다. 하지만 Qt WebEngine 역시 Qt WebKit보다 무겁고 C++ API를 통해 네트워크 스택과 HTML 문서에 직접 액세스할 수 없습니다.

클래스 이름

Qt WebEngine 에 해당하는 Qt WebKit C++ 클래스의 접두사에는"QWeb" 대신"QWebEngine" 이 붙습니다.

Qt WebKit

#include <QWebHistory>
#include <QWebHistoryItem>
#include <QWebPage>
#include <QWebView>

QWebHistory
QWebHistoryItem
QWebPage
QWebView

Qt WebEngine

#include <QWebEngineHistory>
#include <QWebEngineHistoryItem>
#include <QWebEnginePage>
#include <QWebEngineView>

QWebEngineHistory
QWebEngineHistoryItem
QWebEnginePage
QWebEngineView

Qt 모듈 이름

qmake 프로젝트 파일에서

Qt 웹킷

QT += webkitwidgets

Qt WebEngine

QT += webenginewidgets

소스 파일에 모듈 포함하기

Qt 웹킷

#include <QtWebKit/QtWebKit>
#include <QtWebKitWidgets/QtWebKitWidgets> // With Qt >= 4.8

Qt WebEngine

#include <QtWebEngineWidgets/QtWebEngineWidgets>

Q웹프레임이 Q웹엔진페이지로 병합되었습니다.

HTML 프레임을 사용하여 웹 페이지를 여러 영역으로 나누어 콘텐츠를 개별적으로 표현할 수 있습니다.

Qt WebKit에서 QWebFrame은 웹 페이지 내부의 프레임을 나타냅니다. 각 QWebPage 객체는 적어도 하나의 프레임, 즉 메인 프레임을 포함하며, 이 프레임은 QWebPage::mainFrame()을 사용하여 얻습니다. 단일 프레임의 모양과 내용을 정의하는 HTML <frame> 요소 또는 텍스트 블록 내에 프레임을 삽입하는 <iframe> 요소에 대한 추가 프레임이 생성됩니다.

Qt WebEngine 에서는 프레임 처리가 QWebEnginePage 클래스로 병합되었습니다. 이제 모든 자식 프레임은 콘텐츠의 일부로 간주되며 JavaScript를 통해서만 액세스할 수 있습니다. load() 와 같은 QWebFrame 클래스의 메서드는 이제 QWebEnginePage 을 통해 직접 사용할 수 있습니다.

Qt WebKit

QWebPage page;
connect(page.mainFrame(), SIGNAL(urlChanged(const QUrl&)), SLOT(mySlotName()));
page.mainFrame()->load(url);

Qt WebEngine

QWebEnginePage page;
connect(&page, SIGNAL(urlChanged(const QUrl&)), SLOT(mySlotName()));
page.load(url);

일부 메서드가 이제 결과를 비동기적으로 반환합니다.

Qt WebEngine 은 다중 프로세스 아키텍처를 사용하므로 애플리케이션에서 일부 메서드를 호출하면 즉시 반환되는 반면, 콜백 메커니즘을 통해 비동기적으로 결과를 수신해야 합니다. 결과를 사용할 수 있게 되면 결과를 처리하기 위해 함수 포인터, 함수 또는 람다 식을 제공해야 합니다.

Qt WebKit

QWebPage *page = new QWebPage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit is modified immediately.
textEdit->setPlainText(page->toHtml());
textEdit->setPlainText(page->toPlainText());

Qt WebEngine (C++11의 람다 함수 사용)

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the lambda function is called.
page->toHtml([textEdit](const QString &result){ textEdit->setPlainText(result); });
page->toPlainText([textEdit](const QString &result){ textEdit->setPlainText(result); });

Qt WebEngine (멤버 함수를 감싸는 펑터 템플릿 사용)

template<typename Arg, typename R, typename C>
struct InvokeWrapper {
    R *receiver;
    void (C::*memberFun)(Arg);
    void operator()(Arg result) {
        (receiver->*memberFun)(result);
    }
};

template<typename Arg, typename R, typename C>
InvokeWrapper<Arg, R, C> invoke(R *receiver, void (C::*memberFun)(Arg))
{
    InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFun};
    return wrapper;
}

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the functor is called.
page->toHtml(invoke(textEdit, &QTextEdit::setPlainText));
page->toPlainText(invoke(textEdit, &QTextEdit::setPlainText));

Qt WebEngine (일반 펑터 사용)

struct SetPlainTextFunctor {
    QTextEdit *textEdit;
    SetPlainTextFunctor(QTextEdit *textEdit) : textEdit(textEdit) { }
    void operator()(const QString &result) {
        textEdit->setPlainText(result);
    }
};

QWebEnginePage *page = new QWebEnginePage;
QTextEdit *textEdit = new QTextEdit;
// *textEdit must remain valid until the functor is called.
page->toHtml(SetPlainTextFunctor(textEdit));
page->toPlainText(SetPlainTextFunctor(textEdit));

Qt WebEngine QNetworkAccessManager와 상호 작용하지 않습니다.

QAuthenticator 과 같은 Qt Network 의 일부 클래스는 인터페이스에 재사용되었지만 Qt WebKit과 달리 Qt WebEngine 는 자체 HTTP 구현을 가지고 있으며 QNetworkAccessManager 을 통과 할 수 없습니다.

여전히 지원되는 QNetworkAccessManager 의 시그널과 메서드는 QWebEnginePage 클래스로 이동되었습니다.

Qt WebKit

QNetworkAccessManager qnam;
QWebPage page;
page.setNetworkAccessManager(&qnam);
connect(&qnam, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authenticate(QNetworkReply*,QAuthenticator*)));

Qt WebEngine

QWebEnginePage page;
connect(&page, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authenticate(QNetworkReply*,QAuthenticator*)));

참고: Qt WebEngine 에서 QAuthenticator 을 명시적으로 null로 설정해야 인증을 취소할 수 있습니다:

*authenticator = QAuthenticator();

QNetworkAccessManager 을 생략하면 인증서가 관리되는 방식에도 영향을 줍니다. 자세한 내용은 인증서 관리하기를 참조하세요.

개별 방법에 대한 참고 사항

평가자바스크립트

QWebFrame::evaluateJavaScript가 QWebEnginePage::runJavaScript 로 옮겨지고 이름이 변경되었습니다. 현재 페이지의 메인 프레임에서만 JavaScript를 실행할 수 있으며 결과는 제공된 함수에 비동기적으로 반환됩니다.

Qt WebKit

Q웹페이지 *페이지 = 새로운 Q웹페이지;qDebug() << page->mainFrame()->evaluateJavaScript("'Java' + 'Script'");

Qt WebEngine (C++11의 람다 표현식 사용)

QWebEnginePage *page = new QWebEnginePage;
page->runJavaScript("'Java' + 'Script'", [](const QVariant &result){ qDebug() << result; });

setHtml과 setContent

QWebEnginePage::setHtmlQWebEnginePage::setContent 는 일반 HTTP 로드와 동일한 방식으로 비동기적으로 수행되지만, QWebPage와는 다릅니다.

setContentEditable

최신 HTML 표준에서 모든 문서 요소는 contentEditable 속성을 통해 편집 가능하게 만들 수 있기 때문에 QWebPage::setContentEditable에는 이에 상응하는 것이 없습니다. 따라서 QWebEnginePage::runJavaScript 만 있으면 됩니다.

Qt WebKit

QWebPage page;
page.setContentEditable(true);

Qt WebEngine

QWebEnginePage page;
page.runJavaScript("document.documentElement.contentEditable = true");

사용할 수 없는 Qt WebKit API

이 목록의 Qt WebKit 클래스 및 메서드는 Qt WebEngine 에서 사용할 수 없습니다.

QGraphicsWebViewQt WebEngine 는 하드웨어 가속과 함께 사용하도록 설계되었습니다. 웹 뷰 클래스는 QGLWidget 뷰포트에 연결되지 않는 한 QGraphicsView 에서 지원할 수 없으므로 이 기능은 범위에서 제외됩니다.
QWebElementQt WebEngine 는 다중 프로세스 아키텍처를 사용하므로 페이지의 내부 구조에 대한 모든 액세스는 비동기적으로 이루어져야 하며, 쿼리 결과는 콜백을 통해 반환되어야 합니다. QWebElement API는 동기식 액세스를 위해 설계되었으므로 완전히 재설계해야 합니다.
QWebDatabase이 API가 Qt WebKit에서 래핑하던 웹 SQL 데이터베이스 기능이 HTML5 표준에서 삭제되었습니다.
QWebPluginDatabase, QWebPluginFactory, QWebPluginInfo, QWebPage::setPalette, QWebView::setRenderHintsQt WebEngine 는 Skia를 사용하여 웹 페이지를 렌더링하며 이 목적으로 QPainter 또는 Qt를 사용하지 않습니다. HTML5 표준은 또한 Qt WebKit에 네이티브 컨트롤 플러그인이 도입되었을 때 사용할 수 없었던 훨씬 더 나은 대안을 제공합니다.
QWebHistoryInterface방문한 링크는 Qt WebEngine 에 의해 자동으로 유지됩니다.
QWebPage::setContentEditable최신 HTML 표준에서는 contentEditable 속성을 통해 모든 문서 요소를 편집 가능하게 만들 수 있습니다. 따라서 runJavaScript 만 있으면 됩니다: page->runJavaScript("document.documentElement.contentEditable = true")
QWebPage::setLinkDelegationPolicy링크가 클릭될 때 C++ 코드를 실행하도록 신호를 연결할 수 있는 방법은 없습니다. 그러나 링크 클릭은 QWebEnginePage::acceptNavigationRequest() 함수를 오버로드하여 HTML 핸들러 엔진이 처리하는 대신 Qt 애플리케이션에 위임할 수 있습니다. 이는 결과 목록을 표시할 때와 같이 외부 데이터를 표시하지 않고 사용자 인터페이스의 일부로 HTML 문서를 사용할 때 필요합니다.

참고: acceptNavigationRequest()는 로딩 프로세스를 시작하고 요청이 수락되거나 거부되기 전에 loadStarted() 신호를 보냅니다. 따라서 요청을 위임한 후에도 false 을 반환하는 loadFinished() 신호가 예상됩니다.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.