【问题标题】:To what is castable QML WebView to?什么是可转换的 QML WebView?
【发布时间】:2012-05-03 01:50:14
【问题描述】:

说我们有一些

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 转换为具有 -&gt;page() 之类的方法的 Qt 对象?

【问题讨论】:

    标签: c++ qt webkit qml


    【解决方案1】:

    查了代码,发现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 网络视图元素并访问网页。

    //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();
    

    【讨论】:

    • 以及如何创建这样的对象,以便它可以从外部 qml 中使用,而不是作为主要的 ui 元素?
    • 此链接应该有助于将 QWidget 派生对象放入 QML,kunalmaemo.blogspot.com/2011/07/…
    • 我很笨(((我不知道怎么转这个甚至[这个](kunalmaemo.blogspot.com/2011/08/…)你能解释一下吗?
    • 你想把 QGraphicsWebView 放到 QML 并且还想访问 QWebPage ?,我建议创建自定义 QDeclarativeItem,你可以简单地制作 QGraphicsWebView,QDeclarativeItem 的孩子,然后你可以将它暴露给 QML,并从c++ 代码,您可以将对象转换为自定义类并访问 webview 和网页。
    • @you want to put QGraphicsWebView to QML and also want to acceess QWebPage - 是的..
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多