ウィンドウのサイズが変更されたときに、QGraphicsViewの問題をすべてのスペースを取るためにQGraphicsItemのサイズ変更
-
25-09-2019 - |
質問
私は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);
...
の代わりにQDeclarativeView
がsetSource()
を呼び出すことによって、自動的にそれを行うせるの。私は特定のイベントが発生した場合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
は十分に迅速にリサイズされていない、それが追いつくと、それのサイズを変更する前に、あなたは簡単に灰色の背景を参照してください。そのまた、非常に滑らかではない。
これはのみ発生します。それは単純な項目のための罰金に動作します。 。その正確かつスムーズにリサイズ
:事は、私は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で行われます。
他のヒント
私はないです確かこれはちらつきを取り除くでしょうが、あなたが使用できるかどうあなたのfitInView
でresizeEvent()
するます:
declarativeView->fitInView(object, Qt::IgnoreAspectRatio);