ウィンドウのサイズが変更されたときに、QGraphicsViewの問題をすべてのスペースを取るためにQGraphicsItemのサイズ変更

StackOverflow https://stackoverflow.com/questions/4010290

質問

私はQGraphicsItem(実際には、QDeclarativeItem)を持っていると私はそれはそれは添加したQGraphicsView(再び、その実際に派生QDeclarativeViewクラス)の全可視スペースを取るしたいと思います。通常、あなたは自動的にビューに合うように、ルートオブジェクトのサイズを変更しますQDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView)QDeclarativeViewを使用することができます。

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

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

の代わりにQDeclarativeViewsetSource()を呼び出すことによって、自動的にそれを行うせるの。私は特定のイベントが発生した場合QMLのシーンを交換したいが、私は前のシーンを破壊したくないので、私はこれをやっている理由があります。 setSource()を呼び出すとsetSource()が呼び出される前に、追加されたすべての項目を削除します。だから、代わりに私は自分自身を「ルートオブジェクト」を作成していて、手動でシーンに追加します。

私はこのように、私のQDeclarativeItemのサイズを変更するには、Windows、のresizeEvent のを使用しています

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

この作業を行います!しかし、そのない非常にきれい。あなたはすぐにウィンドウのサイズを変更する場合は、QDeclarativeItemは十分に迅速にリサイズされていない、それが追いつくと、それのサイズを変更する前に、あなたは簡単に灰色の背景を参照してください。そのまた、非常に滑らかではない。

私はサイズ変更され、複雑な項目を(私の場合は、そのA QWebKitウィジェット)持っている場合は、

これはのみ発生します。それは単純な項目のための罰金に動作します。 。その正確かつスムーズにリサイズ

:事は、私はQDeclarativeViewがそれをやらせるならば、私はどちらも、これらの問題の持っていること、しかし、です

私多分私が間違っているものの、これは、そこQtDeclarativeのものに固有ではなく、QGraphicsView想像します。

ないの誰もが任意のアイデアがありますか?

役に立ちましたか?

解決 2

私は私の問題を解決した。

問題はQMLのWebViewの要素であると思われます。 QGraphicsProxyWidgetは、C ++から登録されたため、私は通常のQWebViewにウィジェットセットで、それを切り替えて、すべての問題が消えます。それは今私が行動するのWebViewを期待正確にどのように振る舞うます。

の欠点は、私は手動でQMLにQWebView信号/スロット/プロパティを公開する必要があることです。 (編集:私はウィジェットセットを返しobjectと呼ばれる読み取り専用のプロパティを持つことによって、これを解決してきたのQObjectが自動的にJavaScriptのアクセス可能なオブジェクトに変換されているので、私はこのように、exmapleのために、ウェブビューにアクセスすることができます。object.url = 'http://google.com'の場合を利便性、またI彼QMLオブジェクトONTのinit JavaScript関数呼び出し、私は単純にそこにWeb表示を設定するので、それは、存在する場合 - !素晴らしい作品を)

ロードする

私は質問をするので、私が行わ別変化がQt.createComponentを使用するC ++ -callable JavaScript関数(とフルスクリーン矩形を作成することによって、QML自体にC ++の切り替え「ルートオブジェクト」を移動させることです)」 anchors.fillと実際の」QMLファイルとアンカーを。私は単にsetSource()、Qtのハンドルは、サイズ変更などせることができ、私は(とにかく、アプリのこの部分のために)QMLで純粋に働く代わりに、Cの++、ように、この方法で(オブジェクトのキャッシング)ロジックは、QMLで行われます。

他のヒント

私はないです確かこれはちらつきを取り除くでしょうが、あなたが使用できるかどうあなたのfitInViewresizeEvent()するます:

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top