C++ 调整QGraphicsView的大小以占用QGraphicsView中的所有空间,调整窗口大小时会出现问题

C++ 调整QGraphicsView的大小以占用QGraphicsView中的所有空间,调整窗口大小时会出现问题,c++,qt,qgraphicsview,qtdeclarative,qt-quick,C++,Qt,Qgraphicsview,Qtdeclarative,Qt Quick,我有一个QGraphicsItem(实际上是一个QDeclarativeItem),我希望它占据QGraphicsView的整个可见空间(同样,它实际上是添加到其中的派生QDeclarativeView类)。通常,您可以使用QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView),并且QDeclarativeView将自动调整根对象的大小以适应视图 我遇到的问题是,我正在使用 QDeclarativeCompo

我有一个
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);
    ...
这确实管用!但是,它不是很漂亮。如果快速调整窗口的大小,则
QDeclarativeItem
的调整速度不够快,在它捕捉并调整大小之前,您会短暂看到灰色背景。它也不是很平滑

只有当我有一个正在调整大小的复杂项目(在我的例子中,它是一个QWebKit小部件)时,才会发生这种情况。它适用于更简单的项目。然而,问题是,如果我让
QDeclarativeView
这样做,我就不会有这些问题:它的大小调整正确且平滑

我想这不是特定于qt声明性的东西,而是QGraphicsView,尽管可能我错了


有人有什么想法吗?

我不确定这是否能消除闪烁,但您可以在
resizeEvent()中使用:


我不确定这是否会消除闪烁,但您可以在
resizeEvent()中使用:


我已经解决了我的问题

问题似乎出在QML的WebView元素上。我把它从C++注册的QGoCICICsPROXYWIGET,用小部件设置成一个正常的QWebVIEW,所有的问题消失了。它现在的行为正是我所期望的WebView的行为

缺点是我需要手动将QWebView信号/插槽/属性公开给QML。(编辑:我通过使用名为
object
的只读属性解决了这个问题,该属性返回set小部件。由于QoObject自动转换为javascript可访问的对象,因此我可以访问exmaple的web视图,如下所示:
object.url=)http://google.com“
。为了方便起见,我还调用了QML对象,如果它存在的话,那么我只需将web视图设置在那里——效果很好!)


我提出的另一个改变是将“根对象”从C++移到QML本身,通过创建一个带有C++可调用JavaScript函数的全屏矩形,使用Qt.CeCalCeMoMutual()加载实际的QML文件并用锚定它。这样,逻辑(和对象缓存)在QML中完成,而不是C++,所以我可以简单地设置SuthCube(),让Qt句柄调整大小,这样我就可以完全在QML中工作(无论如何,对于这个应用程序的一部分)。 问题似乎出在QML的WebView元素上。我把它从C++注册的QGoCICICsPROXYWIGET,用小部件设置成一个正常的QWebVIEW,所有的问题消失了。它现在的行为正是我所期望的WebView的行为

缺点是我需要手动将QWebView信号/插槽/属性公开给QML。(编辑:我通过使用名为
object
的只读属性解决了这个问题,该属性返回set小部件。由于QoObject自动转换为javascript可访问的对象,因此我可以访问exmaple的web视图,如下所示:
object.url=)http://google.com“
。为了方便起见,我还调用了QML对象,如果它存在的话,那么我只需将web视图设置在那里——效果很好!)


我提出的另一个改变是将“根对象”从C++移到QML本身,通过创建一个带有C++可调用JavaScript函数的全屏矩形,使用Qt.CeCalCeMoMutual()加载实际的QML文件并用锚定它。这样,逻辑(和缓存对象)在QML中完成,而不是C++,所以我可以简单地设置SuthCube(),让Qt句柄调整大小,这样我就可以完全在QML中工作(无论如何,对于这个应用程序的一部分)。谢谢,我好像错过了这个功能。虽然我不知道为什么内容在视图中居中,显示的背景色(白色)的最小部分类似于白色边框。有什么提示吗?谢谢你,我似乎错过了这个功能。它起作用了,尽管我不知道为什么内容在视图中居中,显示的背景色(白色)的最小部分类似于白色边框。有什么提示吗?

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