什么是可投射的QML WebView?

时间:2012-05-03 01:50:15

标签: c++ qt webkit qml

说我们有一些

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强制转换为某些具有->page()方法的Qt对象?

1 个答案:

答案 0 :(得分:3)

我检查了代码,发现QML Webview元素实际上是 QDeclarativeWebView ,它源自 QDeclarativeItem

QGraphicsWebView 没有进入inheratance层次结构。 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();