使用Ajax请求从QWebView读取本地文件

时间:2023-01-16 21:55:28

I am developing a Qt/C++ program which encapsulates an HTML5/JQuery web app.

我正在开发一个Qt / C ++程序,它封装了一个HTML5 / JQuery Web应用程序。

I used to make Ajax requests to read files from a server. But now, I would like Qt to read a file from the local disk and send its content to my web app.

我曾经做过Ajax请求从服务器读取文件。但是现在,我希望Qt从本地磁盘读取文件并将其内容发送到我的Web应用程序。

I think I need Qt to catch Ajax requests from the web app and return the file content as the Ajax request result.

我想我需要Qt从Web应用程序捕获Ajax请求并返回文件内容作为Ajax请求结果。

The problem is I don't know how to do. For now, I've not found anything about that on google.

问题是我不知道该怎么做。目前,我还没有在谷歌上发现任何相关信息。

Any help is welcome!

欢迎任何帮助!

1 个解决方案

#1


2  

I finally found how to do it. I overrode QNetworkAccessManager.

我终于找到了怎么做。我重写了QNetworkAccessManager。

MyQNetworkAccessManager .h:

class MyQNetworkAccessManager : public QNetworkAccessManager
{
    Q_OBJECT

protected:
    virtual QNetworkReply * createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0);
};

MyQNetworkAccessManager.cpp:

QNetworkReply * MyQNetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData) {
    QUrl url = req.url();
    QString path = url.path();

    if (op == QNetworkAccessManager::GetOperation && path.endsWith("xml")) {
        QUrl newUrl;

        if(path.endsWith("..")) {
            newUrl.setUrl("...");
        }
        else if(path.endsWith("...")) {
            newUrl.setUrl("...");
        }
        else {
            newUrl = url;
        }
        return QNetworkAccessManager::createRequest(QNetworkAccessManager::GetOperation, QNetworkRequest(newUrl));
    }
    else
    {
        return QNetworkAccessManager::createRequest(op, req, outgoingData);
    }
}

MainWindow.cpp:

// ....

QWebView *qWebView = new QWebView();

QWebPage *page = qWebView->page();
MyQNetworkAccessManager *networkManager = new MyQNetworkAccessManager();
page->setNetworkAccessManager(networkManager);

qWebView->setPage(page);

qWebView->load(QUrl("..."));

// ....

#1


2  

I finally found how to do it. I overrode QNetworkAccessManager.

我终于找到了怎么做。我重写了QNetworkAccessManager。

MyQNetworkAccessManager .h:

class MyQNetworkAccessManager : public QNetworkAccessManager
{
    Q_OBJECT

protected:
    virtual QNetworkReply * createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0);
};

MyQNetworkAccessManager.cpp:

QNetworkReply * MyQNetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData) {
    QUrl url = req.url();
    QString path = url.path();

    if (op == QNetworkAccessManager::GetOperation && path.endsWith("xml")) {
        QUrl newUrl;

        if(path.endsWith("..")) {
            newUrl.setUrl("...");
        }
        else if(path.endsWith("...")) {
            newUrl.setUrl("...");
        }
        else {
            newUrl = url;
        }
        return QNetworkAccessManager::createRequest(QNetworkAccessManager::GetOperation, QNetworkRequest(newUrl));
    }
    else
    {
        return QNetworkAccessManager::createRequest(op, req, outgoingData);
    }
}

MainWindow.cpp:

// ....

QWebView *qWebView = new QWebView();

QWebPage *page = qWebView->page();
MyQNetworkAccessManager *networkManager = new MyQNetworkAccessManager();
page->setNetworkAccessManager(networkManager);

qWebView->setPage(page);

qWebView->load(QUrl("..."));

// ....