我们在项目中使用了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
类可以有所帮助。
答案 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呈现。