说我们有一些
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对象?
答案 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();