0

アプリケーション qml に Web ブラウザーを追加しましたが、証明書を必要とする Web サイトに接続できません。Web サイトを追加すると、白いページが表示されるためです。お願い助けて。

ありがとうございました。

4

1 に答える 1

2

信頼されていない証明書を使用する Web サイトと通信するには、以下のように独自の NetworkManagerFactory を QDeclarativeEngine に提供する必要があります。さらに、この手法は、他の場合にネットワーク要求で何が問題になっているのかを監視するのに役立ちます.

class WebViewNetworkManagerFactory
  : public QObject
  , public QDeclarativeNetworkAccessManagerFactory
{
  Q_OBJECT

public:
  explicit WebViewNetworkManagerFactory(QObject *parent = 0)
    : QObject(parent)
  {}

public: // QDeclarativeNetworkAccessManagerFactory
  QNetworkAccessManager *create(QObject *parent) {
    QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(parent);
    connect(networkAccessManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
            this, SLOT(onSslErrors(QNetworkReply*,QList<QSslError>)));
    connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(onReplyFinished(QNetworkReply*)));
    return networkAccessManager;
  }

private slots:
  void onSslErrors(QNetworkReply *reply, const QList<QSslError> &errors) {
    qDebug("onSslErrors");
    reply->ignoreSslErrors(errors);
  }

  void onReplyFinished(QNetworkReply *reply) {
    Q_ASSERT(reply); if (!reply) return;
    if (reply->error() == QNetworkReply::NoError) {
      return;
    }
    const int httpStatusCode = reply->attribute(
      QNetworkRequest::HttpStatusCodeAttribute).toInt();
      qDebug(QString("Network error = %1, HTTP code = %2, error description = '%3'")
               .arg(reply->error())
               .arg(httpStatusCode)
               .arg(reply->errorString())
               .toAscii());
  }
};

ルート DeclarativeView を作成するコードのどこかで使用します。

QDeclarativeView *buildRootView() {
  QScopedPointer<QDeclarativeView> view(new QDeclarativeView());
  QObject::connect(view->engine(), SIGNAL(quit()),
                   view.data(), SLOT(close()));
  view->engine()->setNetworkAccessManagerFactory(
    new WebViewNetworkManagerFactory(view.data()));
  // other initialization stuff...
  return view.take();
}
于 2012-08-22T07:31:21.403 に答える