Отображение содержимого QCH-файла с QWebEngineView - PullRequest
0 голосов
/ 26 октября 2018

Мы используем Qt-Help в наших проектах, но я действительно не удовлетворен форматированием Qt-Help внутри Qt-assistant.Это выглядит ужасно по сравнению с форматированием HTML-файлов в моем Firefox.

Одной из причин может быть то, что Qt-assistant игнорирует javascript при его рендеринге.

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

#include <iostream>
#include <QApplication>
#include <QDebug>
#include <QDialog>
#include <QHBoxLayout>
#include <QHelpContentWidget>
#include <QHelpEngine>
#include <QWebEngineView>

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto help = new QHelpEngine("./data/MyHelp.qhc");
    help->contentWidget()->show();
    QObject::connect(help->contentWidget(), &QHelpContentWidget::linkActivated, [&](const QUrl &link) {
        QDialog dialog;
        auto helpContent = new QWebEngineView;
        helpContent->load(link);
        dialog.setLayout(new QHBoxLayout);
        dialog.layout()->addWidget(helpContent);
        dialog.exec();
    });
    app.exec();
}

К сожалению, QWebEngineView не найдет ссылку QUrl QHC-файла.

Как настроить QWebEngineView, чтобы он искал ресурс внутри QHC-файла?Также необходимо, чтобы все изображения и другие внешние ресурсы в файлах справки HTML были найдены.

Может быть, класс QWebEngineUrlSchemeHandler мог бы помочь.

1 Ответ

0 голосов
/ 26 октября 2018

После некоторых хлопот я нашел рабочее решение для моей проблемы.

main.cpp

#include <iostream>
#include <QApplication>
#include <QDebug>
#include <QDialog>
#include <QHBoxLayout>
#include <QHelpContentWidget>
#include <QHelpEngine>
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QWebEngineProfile>
#include <QDebug>
#include "QtHelpSchemeHandler.h"

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto help = new QHelpEngine("./data/MyHelp.qhc");
    qDebug() << help->setupData();
    help->contentWidget()->show();
    QObject::connect(help->contentWidget(), &QHelpContentWidget::linkActivated, [&](const QUrl &link) {
        QDialog dialog;
        auto helpContent = new QWebEngineView;
        helpContent->page()->profile()->installUrlSchemeHandler("qthelp", new QtHelpSchemeHandler(help));
        helpContent->load(link);
        QObject::connect(helpContent, &QWebEngineView::loadFinished, []() {qDebug() << "Load finished"; });
        dialog.setLayout(new QHBoxLayout);
        dialog.layout()->addWidget(helpContent);
        dialog.exec();
    });
    app.exec();
}

QtHelpSchemeHandler

#include <QWebEngineUrlSchemeHandler>
#include <QDebug>
#include <QHelpEngine>
#include <QWebEngineUrlRequestJob>
#include <QBuffer>

class QtHelpSchemeHandler : public QWebEngineUrlSchemeHandler {
    Q_OBJECT
public:
    QtHelpSchemeHandler(QHelpEngine* helpEngine) : mHelpEngine(helpEngine) {

    }

    virtual void requestStarted(QWebEngineUrlRequestJob* job) override {
        auto url = job->requestUrl();
        auto data = new QByteArray; // Needs to be destroyed. Not re-entrant
        *data = mHelpEngine->fileData(url);
        auto buffer = new QBuffer(data);
        if (url.scheme() == "qthelp") {
            job->reply("text/html", buffer);
        }
    }
private:
    QHelpEngine* mHelpEngine;
};

Сгенерированный вывод соответствует формату HTML в моем браузере Firefox.

...