QWebView에서 동적으로 생성 된 이미지를 표시하는 방법은 무엇입니까?

드미트리 쿠즈 미 노프

동적으로 생성 된 HTML 콘텐츠를 표시하는 QtWebKit을 사용하고 있으며 데이터베이스에서 검색 한 이미지를 표시해야합니다. 예를 들어 리소스의 이미지를 표시해야하는 경우 다음에서 사용하는 콘텐츠에 다음 줄을 추가합니다 QWebView::setHtml.

<img src="qrc:/images/image.jpg"/>

훌륭하게 작동하며 WebView는 자동으로 리소스를 찾아 표시합니다. 이제이 이미지를 데이터베이스에서 검색 한 콘텐츠로 대체해야하며 파일 시스템에 파일이 없습니다. 그렇게하는 방법?

콘텐츠를 동적으로 추가 하는 qrc 네임 스페이스를 관리 할 수 ​​있습니까 ? WebView에서 요청을 수신하고 제공하는 자체 QRC 핸들러를 추가 할 수 있습니까? QRC가 아닌 경우 WebView의 이미지에 콘텐츠를 제공하는 데 사용할 수있는 다른 프로토콜이 있습니까?

setHtml메서드를 사용하여 WebView에 추가하는 항목을 완전히 제어 할 수 있습니다.

업데이트 : QWebEngineView 에서도 동일한 문제를 해결하고 싶습니다 .

Eyllanesc

QtWebkit

QtWebkit의 경우 QNetworkAccessManager를 사용하여 요청을 가로 채고 사용자 지정 QNetworkReply를 다시 보내야합니다.

#include <QtWebKitWidgets>

class CustomReply : public QNetworkReply{
public:
    explicit CustomReply(const QByteArray & content, const QByteArray & contentType, const QUrl & url):
        QNetworkReply(), m_content(content){
        offset = 0;
        setUrl(url);
        open(ReadOnly | Unbuffered);
        setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType));
        setHeader(QNetworkRequest::ContentLengthHeader, QVariant(m_content.size()));
        QTimer::singleShot(0, this, &CustomReply::dispatch);
    }
    bool isSequential() const{
        return true;
    }
    qint64 bytesAvailable() const{
        return m_content.size() - offset + QIODevice::bytesAvailable();
    }
public slots:
    void abort(){
    }
protected:
    qint64 readData(char *data, qint64 maxSize){
        if (offset < m_content.size()) {
            qint64 number = qMin(maxSize, m_content.size() - offset);
            ::memcpy(data, m_content.constData() + offset, number);
            offset += number;
            return number;
        } else
            return -1;
    }
private:
    void dispatch(){
        emit readyRead();
        emit finished();
    }
    QByteArray m_content;
    qint64 offset;
};

class NetworkAccessManager: public QNetworkAccessManager{
public:
    using QNetworkAccessManager::QNetworkAccessManager;
protected:
    QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData){
        qDebug() << request.url();
        if (request.url() == QUrl("qrc:/images/image.jpg")){

            QImage image(150, 150, QImage::Format_RGB32);
            image.fill(QColor("salmon"));

            QByteArray ba;
            QBuffer buffer(&ba);
            buffer.open(QIODevice::WriteOnly);
            image.save(&buffer, "JPEG");

            return new CustomReply(ba, "image/jpeg", request.url());
        }
        return QNetworkAccessManager::createRequest(op, request, outgoingData);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWebView view;
    view.resize(640, 480);
    view.show();

    view.page()->setNetworkAccessManager(new NetworkAccessManager);

    QString html = R"(<img src="qrc:/images/image.jpg">)";
    view.setHtml(html);
    return a.exec();
}

QtWebEngine

QtWebEngine에서 QWebEngineUrlSchemeHandler를 구현해야하지만 qrc, http 또는 https 스키마를 사용할 수 없습니다.

#include <QtWebEngineWidgets>

#define SCHEMENAME "so"

class Handler : public QWebEngineUrlSchemeHandler{
public:
    void requestStarted(QWebEngineUrlRequestJob *job){
        if(job->requestUrl() == QUrl("so:/images/image.jpg")){
            QImage image(150, 150, QImage::Format_RGB32);
            image.fill(QColor("salmon"));

            QBuffer *buffer = new QBuffer;
            buffer->open(QIODevice::WriteOnly);
            image.save(buffer, "JPEG");
            buffer->seek(0);
            buffer->close();

            job->reply("image/jpeg", buffer);
        }
    }
    static void registerUrlScheme(){
        QWebEngineUrlScheme webUiScheme(SCHEMENAME);
        webUiScheme.setFlags(QWebEngineUrlScheme::SecureScheme |
                             QWebEngineUrlScheme::LocalScheme |
                             QWebEngineUrlScheme::LocalAccessAllowed);
        QWebEngineUrlScheme::registerScheme(webUiScheme);
    }

};


int main(int argc, char *argv[])
{
    Handler::registerUrlScheme();

    QApplication a(argc, argv);
    QWebEngineView view;

    Handler handler;
    view.page()->profile()->installUrlSchemeHandler(SCHEMENAME, &handler);
    view.resize(640, 480);
    view.show();

    QString html = R"(<img src="so:/images/image.jpg">)";
    view.setHtml(html);

    return a.exec();
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

동적으로 생성 된 div 안에 이미지를 추가하는 방법은 무엇입니까?

분류에서Dev

django 템플릿에 저장된 동적 생성 이미지를 표시하는 방법은 무엇입니까?

분류에서Dev

Nodejs에서 동적으로 생성 된 HTML에서 이미지를 생성하는 방법은 무엇입니까?

분류에서Dev

Java에서 동적으로 생성 된 요소를 다시 호출하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 입력에서 양식 데이터를 POST하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 html 테이블 안에 4 개의 라디오 버튼을 동적으로 표시하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 링크를 클릭하여 해당 링크에서 새 동적 페이지를 생성하는 방법은 무엇입니까?

분류에서Dev

TextView Array에서 동적으로 생성 된 textview를 별도로 처리하는 방법은 무엇입니까?

분류에서Dev

Jquery를 사용하여 동적으로 생성 된 테이블 데이터에 더 많은 옵션을 표시하는 방법은 무엇입니까?

분류에서Dev

다른 HTML 파일에서 동적으로 생성 된 이미지를 사용하는 방법은 무엇입니까?

분류에서Dev

jQuery 동적으로 생성 된 div에서 동적으로 생성 된 요소를 추가 / 제거하는 방법은 무엇입니까?

분류에서Dev

window.location.href에서 동적으로 생성 된 ID를 사용하는 방법은 무엇입니까?

분류에서Dev

div 수준에서 동적으로 생성 된 필드를 제거하는 방법은 무엇입니까?

분류에서Dev

조건문에서 동적으로 생성 된 JavaScript 객체를 사용하는 방법은 무엇입니까?

분류에서Dev

이미로드 된 페이지에서 TCPDF pdf를 생성하고 표시하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 요소 (LI)에 ondragstart =“drag (event)”를 추가하는 방법은 무엇입니까?

분류에서Dev

Vaadin UI에 동적으로 생성 된 SVG를 포함하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 객체를 문자열에 할당하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 ID를 jQuery에 전달하는 방법은 무엇입니까?

분류에서Dev

동적으로 추가 된 이미지에서 imagepicker.js를 사용하는 방법은 무엇입니까?

분류에서Dev

Struts 2에서 동적으로 생성 된 JSP 페이지에서 데이터를 가져 오는 방법은 무엇입니까?

분류에서Dev

프로토 타입 내에서 동적으로 생성 된 요소에 이벤트 리스너를 추가하는 방법은 무엇입니까?

분류에서Dev

Selenium에서 동적으로 생성 된 페이지에서 HTML 요소를 가져 오는 방법은 무엇입니까?

분류에서Dev

Android에서 동적으로 생성 된 TextView의 높이를 자동으로 늘리는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 클래스와 ID가있는 요소를 동시에 선택하는 방법은 무엇입니까?

분류에서Dev

CDK에서 생성 된 Lambda를 정기적으로 실행하는 방법은 무엇입니까?

분류에서Dev

동적으로 작성된 양식에서 데이터를 가져 오는 방법은 무엇입니까?

분류에서Dev

Outlook의 할 일 모음에 명시 적으로 생성 된 작업 (캘린더 이벤트 아님) 만 표시하는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 두 요소를 span으로 래핑하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    동적으로 생성 된 div 안에 이미지를 추가하는 방법은 무엇입니까?

  2. 2

    django 템플릿에 저장된 동적 생성 이미지를 표시하는 방법은 무엇입니까?

  3. 3

    Nodejs에서 동적으로 생성 된 HTML에서 이미지를 생성하는 방법은 무엇입니까?

  4. 4

    Java에서 동적으로 생성 된 요소를 다시 호출하는 방법은 무엇입니까?

  5. 5

    동적으로 생성 된 입력에서 양식 데이터를 POST하는 방법은 무엇입니까?

  6. 6

    동적으로 생성 된 html 테이블 안에 4 개의 라디오 버튼을 동적으로 표시하는 방법은 무엇입니까?

  7. 7

    동적으로 생성 된 링크를 클릭하여 해당 링크에서 새 동적 페이지를 생성하는 방법은 무엇입니까?

  8. 8

    TextView Array에서 동적으로 생성 된 textview를 별도로 처리하는 방법은 무엇입니까?

  9. 9

    Jquery를 사용하여 동적으로 생성 된 테이블 데이터에 더 많은 옵션을 표시하는 방법은 무엇입니까?

  10. 10

    다른 HTML 파일에서 동적으로 생성 된 이미지를 사용하는 방법은 무엇입니까?

  11. 11

    jQuery 동적으로 생성 된 div에서 동적으로 생성 된 요소를 추가 / 제거하는 방법은 무엇입니까?

  12. 12

    window.location.href에서 동적으로 생성 된 ID를 사용하는 방법은 무엇입니까?

  13. 13

    div 수준에서 동적으로 생성 된 필드를 제거하는 방법은 무엇입니까?

  14. 14

    조건문에서 동적으로 생성 된 JavaScript 객체를 사용하는 방법은 무엇입니까?

  15. 15

    이미로드 된 페이지에서 TCPDF pdf를 생성하고 표시하는 방법은 무엇입니까?

  16. 16

    동적으로 생성 된 요소 (LI)에 ondragstart =“drag (event)”를 추가하는 방법은 무엇입니까?

  17. 17

    Vaadin UI에 동적으로 생성 된 SVG를 포함하는 방법은 무엇입니까?

  18. 18

    동적으로 생성 된 객체를 문자열에 할당하는 방법은 무엇입니까?

  19. 19

    동적으로 생성 된 ID를 jQuery에 전달하는 방법은 무엇입니까?

  20. 20

    동적으로 추가 된 이미지에서 imagepicker.js를 사용하는 방법은 무엇입니까?

  21. 21

    Struts 2에서 동적으로 생성 된 JSP 페이지에서 데이터를 가져 오는 방법은 무엇입니까?

  22. 22

    프로토 타입 내에서 동적으로 생성 된 요소에 이벤트 리스너를 추가하는 방법은 무엇입니까?

  23. 23

    Selenium에서 동적으로 생성 된 페이지에서 HTML 요소를 가져 오는 방법은 무엇입니까?

  24. 24

    Android에서 동적으로 생성 된 TextView의 높이를 자동으로 늘리는 방법은 무엇입니까?

  25. 25

    동적으로 생성 된 클래스와 ID가있는 요소를 동시에 선택하는 방법은 무엇입니까?

  26. 26

    CDK에서 생성 된 Lambda를 정기적으로 실행하는 방법은 무엇입니까?

  27. 27

    동적으로 작성된 양식에서 데이터를 가져 오는 방법은 무엇입니까?

  28. 28

    Outlook의 할 일 모음에 명시 적으로 생성 된 작업 (캘린더 이벤트 아님) 만 표시하는 방법은 무엇입니까?

  29. 29

    동적으로 생성 된 두 요소를 span으로 래핑하는 방법은 무엇입니까?

뜨겁다태그

보관