使用QWebEngineView显示QCH文件的内容

时间:2018-10-26 11:18:19

标签: qt python-sphinx qwebengineview qwebpage qthelp

我们在项目中使用了Qt-Help,但是我对Qt-assantant中的Qt-Help的格式真的不满意。与我的Firefox中HTML文件的格式相比,它看起来确实很丑。

原因之一可能是Qt助手在其呈现中忽略了javascript。

因此,我尝试实现一个非常简单的testrunner,它应该显示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找不到QHC文件的QUrl链接。

如何配置QWebEngineView,以便它在QHC文件中查找资源?还必须找到HTML帮助文件中的所有图像和其他外部资源。

也许QWebEngineUrlSchemeHandler类可以有所帮助。

1 个答案:

答案 0 :(得分:0)

经过一番麻烦之后,我为我的问题找到了可行的解决方案。

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;
};

生成的输出适合我的Firefox浏览器中的HTML呈现。