什么是可铸造的QML WebView

To what is castable QML WebView to?

本文关键字:QML WebView 什么      更新时间:2023-10-16

假设我们有一些

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 中的 dsefineed 转换为具有类似 ->page() 方法的一些 Qt 对象?

我检查了代码,发现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();