我有一个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()调用之前添加的所有项目。所以,代替我创建“根对象”自己和它的手动添加到场景中。

我使用Windows的 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,虽然也许我错了。

没有任何人有什么想法?

有帮助吗?

解决方案 2

我已经解决了我的问题。

这个问题似乎是与QML的web视图元件。我打开它出去QGraphicsProxyWidget由C ++注册,与小部件设置为普通QWebView,所有的问题都会消失。它现在的行为正是我所期望的WebView中的行为。

不足之处是我需要手动暴露QWebView信号/插槽/属性QML。 (编辑:我已经有一个只读属性称为object,该控件返回集合地解决了这个自QObject对象被自动转换为JavaScript访问对象,我可以访问Web视图,为〔实施例,像这样:object.url = 'http://google.com'对于方便起见,我还调用初始化JavaScript函数ONT他QML对象,如果存在的话,那么我只需设置Web视图那里! - 伟大工程)

另一个变化,因为我问的问题是,通过与使用Qt.createComponent(一个C ++ -callable javascript函数创建一个全屏矩形)加载到移动“根对象”从C ++切换到QML本身我提出的“实际的” QML文件并anchors.fill锚它。这样(的对象和缓存)的逻辑在QML完成的,而不是C ++,所以我可以简单的SetSource(),让Qt的手柄大小调整和这样的,我在QML纯粹是工作(用于应用程序的一部分,反正)。

其他提示

我不知道这是否会摆脱闪烁的,但你可以使用fitInView resizeEvent()

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top