1

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

原因之一可能是 Qt 助手在其呈现中忽略了 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找不到QUrlQHC 文件的链接。

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

也许这门课QWebEngineUrlSchemeHandler可能会有所帮助。

4

1 回答 1

2

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

主文件

#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 呈现。

于 2018-10-26T12:20:59.627 回答