1

私はQGraphicsItem(実際には)を持っており、それが追加された(これも実際には派生クラス)QDeclarativeItemの可視スペース全体を占めるようにしたいです。通常は、ビューに合わせてルートオブジェクトを使用でき、自動的にサイズ変更されます。QGraphicsViewQDeclarativeViewQDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView)QDeclarativeView

私が抱えている問題は、を使用してルートウィジェットを手動で作成していることです

QDeclarativeComponent component(declarativeView->engine(), QUrl(qml));
QDeclarativeItem* object = qobject_cast<QDeclarativeItem*>(component.create());
if (object)
{
    declarativeView->scene()->addItem(object);
    ...

QDeclarativeViewを呼び出すことによって自動的にそれを行わせる代わりにsetSource()。これを行う理由は、特定のイベントが発生したときにQMLシーンを交換したいが、前のシーンを破棄したくないためです。呼び出すと、が呼び出されるsetSource()前に追加されたすべてのアイテムが削除されます。setSource()そのため、代わりに自分で「ルートオブジェクト」を作成し、それを手動でシーンに追加しています。

私は次のように、ウィンドウのresizeEventを使用してサイズを変更していますQDeclarativeItem

void AppWindow::resizeEvent (QResizeEvent* event)
{
    QDeclarativeItem* object = sceneCache.value(sceneName, 0);
    if (object)
    {
        object->setWidth(declarativeView->viewport()->width());
        object->setHeight(declarativeView->viewport()->height());
    }
}

これは機能します!しかし、それはあまりきれいではありません。ウィンドウのQDeclarativeItemサイズをすばやく変更すると、のサイズが十分に速くならず、追いついてサイズを変更する前に、灰色の背景が一時的に表示されます。また、あまりスムーズではありません。

これは、サイズ変更されている複雑なアイテム(私の場合はQWebKitウィジェット)がある場合にのみ発生します。単純なアイテムには問題なく機能します。ただし、それをQDeclarativeViewやらせても、これらの問題はどちらも発生しません。サイズが正しくスムーズに変更されます。

これはQtDeclarativeのものに固有のものではなく、QGraphicsViewに固有のものだと思いますが、おそらく私はそこで間違っています。

誰かアイデアはありますか?

4

2 に答える 2

3

問題を解決しました。

問題は QML の WebView 要素にあるようです。C ++から登録されたQGraphicsProxyWidgetに切り替え、ウィジェットを通常のQWebViewに設定すると、すべての問題がなくなりました。WebView の動作を期待どおりに動作するようになりました。

欠点は、QWebView シグナル/スロット/プロパティを手動で QML に公開する必要があることです。(編集: 設定されたウィジェットを返す という読み取り専用プロパティを持つことでこれを解決しましたobject。QObjects は JavaScript でアクセス可能なオブジェクトに自動的に変換されるため、たとえば次のように Web ビューにアクセスできますobject.url = 'http://google.com'。便宜上、また、QML オブジェクトが存在する場合は、その上で init javascript 関数を呼び出すので、そこに Web ビューを設定するだけです - うまくいきます!)

私が質問してから行ったもう 1 つの変更は、Qt.createComponent() を使用して「実際の」QML をロードする C++ 呼び出し可能な JavaScript 関数でフルスクリーンの Rectangle を作成することにより、「ルート オブジェクト」の切り替えを C++ から QML 自体に移動することです。ファイルを作成し、anchors.fill で固定します。このように、ロジック (およびオブジェクトのキャッシュ) は C++ ではなく QML で行われるため、単純に setSource() を実行し、Qt にサイズ変更などを処理させ、純粋に QML で作業します (アプリのこの部分についてはとにかく)。

于 2010-10-26T17:49:31.360 に答える
2

これでちらつきがなくなるかどうかはわかりませんが、次のようfitInViewに使用できますresizeEvent()

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
于 2010-10-25T15:41:23.847 に答える