0

我正在从 Web 服务加载 JSON,QNetworkRequest然后将其放入JsonDataAccess对象中。我可以解析 JSON,一切都很好。

但是我想将 JSON 字符串格式化为 HTML 并将其显示在一个 WebView 中,这似乎不适用于finished(QNetworkReply*)信号使用的线程,因为它应该是非 UI 阻塞的。

MapView但是,我可以使用相同的方法向 a 添加标记。但是更新WebView不起作用。如何进入主线程来更新 WebView?

这是我目前使用的方法(插槽):

void ApplicationUI::onLoadJsonFinished(QNetworkReply* reply) {

    JsonDataAccess jda;
    jsonData = jda.load(reply);

    qDebug() << "Received JSON data: " << jsonData;

    QVariant result = jsonData.value<QVariantMap>();
    QString addressTitle = result.toMap().value("address").toMap().value("title").toString();

QObject* webViewAsQObject = root->findChild<QObject*>(
        QString("imprintWebViewObj"));
if (webViewAsQObject) {
    WebView* webView = qobject_cast<bb::cascades::WebView*>(
            webViewAsQObject);

    QString html = QString("<h1>foo</h1>");
    qDebug() << "Loading html into webview: " << html;
    webView->setHtml(html);
}
}

这是 qml 文件:

import bb.cascades 1.2

Page {
    Container {
        layout: DockLayout {
        }
        Container {

            Container {
                leftPadding: 20
                topPadding: 30
                bottomPadding: 30
                Label {
                    text: "Impressum"
                    textStyle.fontFamily: "Georgia"
                    textStyle.fontSize: FontSize.Large
                }

                ScrollView {
                    Container {
                        background: Color.create("#f8f8f8")
                        layout: StackLayout {
                            orientation: LayoutOrientation.TopToBottom
                        }
                        WebView {
                            id: imprintWebView
                            objectName: "imprintWebViewObj"   
                        }

                    }

                }

            }

        } // Container Content end


    }

}
4

1 回答 1

0

我解决了这个问题。有两个问题与线程无关,而是与我如何处理导航窗格堆栈中的页面有关。

我有一个在事件Label中推送页面。onTouch不幸的是,我没有检查TouchEvent.UP. 这导致页面被推送了两次,但标签只在第一页发生了变化。因此,现在正确的代码是:

                Label {
                    text: "Imprint"
                    onTouch: {
                        if (event.touchType == TouchType.Up) {
                            navigationPane.push(imprintDefinition.createObject());
                            _main.loadImprint();
                        }
                    }
                }

其次,虽然我弹出了页面,但对象仍在内存中。因此,当我这样做时,root->findObject()它发现了一个带有 的“旧”对象object name,但这不是屏幕上可见的对象。

我通过将它添加到导航窗格来解决这个问题,如 BlackBerry 文档(http://developer.blackberry.com/native/documentation/cascades/ui/navigation/multiple_screens_stack.html)中所述:

NavigationPane {
    id: navigationPane

    Page {
     // ...
    } // Page

    onPopTransitionEnded: {
        page.destroy();
    }
}
于 2013-09-20T09:48:20.100 回答