代码之家  ›  专栏  ›  技术社区  ›  Dan

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

  •  1
  • Dan  · 技术社区  · 14 年前

    QGraphicsItem (实际上 QDeclarativeItem QGraphicsView (同样,它实际上是 QDeclarativeView QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView) QdeClaratiview公司

    我遇到的问题是,我正在使用

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

    QdeClaratiview公司 自动打电话 setSource() 设置源() 删除以前添加的所有项 设置源() 被称为。所以,我自己创建“根对象”并手动将其添加到场景中。

    我在用窗户 resizeEvent公司 调整我的 ,就像这样:

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

    这确实有效!但是,不是很漂亮。如果快速调整窗口大小,则 没有足够快地调整大小,在它赶上并调整大小之前,您会短暂地看到灰色背景。它也不是很光滑。

    QdeClaratiview公司 做吧,我没有这些问题:它的大小调整正确和顺利。

    我想这不是qt声明性的东西,而是QGraphicsView,尽管也许我错了。

    有人有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   user21037 user21037    14 年前

    我已经解决了我的问题。

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

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

    我问的另一个改变是,将“根对象”从C++移到QML本身,通过创建一个带有C++可调用JavaScript函数的全屏矩形,使用Qt.CeCaleCyMutTune()加载实际的QML文件并用锚定。这样,逻辑(和缓存对象)在QML中完成,而不是C++,所以我可以简单地设置SuthCube(),让Qt句柄调整大小,这样我就可以纯粹地在QML中工作(无论如何,对于这个应用程序的一部分)。

        2
  •  2
  •   Stephen Chu    14 年前

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

    declarativeView->fitInView(object, Qt::IgnoreAspectRatio);