3

说我们有一些

WebView {
           id: webView
           objectName: "webView"
...

我们可以通过以下方式成功找到它:

  QObject *object = w.ui->rootObject();
    QObject *object_webView = object->findChild<QObject*>("webView");

但是为什么我们不能将它投射到 QWebView,而不是 QGraphicsWebView,如下所示:

QGraphicsWebView * view = qobject_cast<QGraphicsWebView *>(object_webView);

所以我想知道如何将 qml WebView 中的 dsefined 转换为具有类似方法的 Qt 对象->page()

4

1 回答 1

3

我检查了代码,发现 QML Webview 元素实际上是QDeclarativeWebView,它是从QDeclarativeItem派生的。

QGraphicsWebView不进入继承层次结构。QGraphicsWebView 是 QDeclarativeWebView 的私有成员。

为了让您能够访问 QWebPage,我想您必须使用 QDeclarativeItem 创建自己的自定义 WebView 元素。

以下代码应该有助于澄清问题。

QDeclarativeWebView::QDeclarativeWebView(QDeclarativeItem *parent) : QDeclarativeItem(parent)
{
    init();
}

void QDeclarativeWebView::init()
{
    d = new QDeclarativeWebViewPrivate(this);

...

    d->view = new GraphicsWebView(this);
    d->view->setResizesToContents(true);
    QWebPage* wp = new QDeclarativeWebPage(this);
    setPage(wp);
  ...
}

GraphicsWebView::GraphicsWebView(QDeclarativeWebView* parent)
    : QGraphicsWebView(parent)
    , parent(parent)
    , pressTime(400)
{
}

class WebKitQmlPlugin : public QDeclarativeExtensionPlugin {
    Q_OBJECT
public:
    virtual void registerTypes(const char* uri)
    {
        Q_ASSERT(QLatin1String(uri) == QLatin1String("QtWebKit"));
        qmlRegisterType<QDeclarativeWebSettings>();
        qmlRegisterType<QDeclarativeWebView>(uri, 1, 0, "WebView");
    }
};

通过使用以下代码,您可以创建自定义 QML Web 视图元素并访问网页。

//custom QML web view element
MyDeclarativeWebView::MyDeclarativeWebView(QDeclarativeItem *parent) 
    : QDeclarativeItem(parent)
{
   mGraphicsWebView = new QGraphicsWebView(this);
}

QGraphicsWebView* MyDeclarativeWebView::webView() const {
    return mGraphicsWebView;
}

//register webview  wlement in main.cpp
qmlRegisterType<QmlLabel>("MyWebView", 1, 0, "MyWebView");

//use your old code to access custom webview element
QObject *object = w.ui->rootObject();
QObject *myWebViewObj = object->findChild<QObject*>("webView");
MyDeclarativeWebView * myWebView = qobject_cast<MyDeclarativeWebView *>(myWebViewObj);
QGraphicsWebView* graphivsWebview = myWebView->webView();
于 2012-05-03T05:19:16.490 回答