Отображение содержимого QCH-файла с QWebEngineView
Мы используем Qt-Help в наших проектах, но я действительно не удовлетворен форматированием Qt-Help внутри Qt-assistant. Это выглядит очень некрасиво по сравнению с форматированием HTML-файлов внутри моего Firefox.
Одной из причин может быть то, что 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
не найдете QUrl
ссылка на QHC-файл.
Как я могу настроить QWebEngineView
, так что будет искать ресурс внутри QHC-файла? Также необходимо, чтобы все изображения и другие внешние ресурсы в файлах справки HTML были найдены.
Может быть, класс QWebEngineUrlSchemeHandler
может помочь
1 ответ
После некоторых хлопот я нашел рабочее решение для моей проблемы.
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.