我有一个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,尽管我可能错了。
有人有什么想法吗?
发布于 2010-10-26 17:49:31
我已经解决了我的问题。
问题似乎在于QML的WebView元素。我将其转换为从QGraphicsProxyWidget注册的C++,将小部件设置为正常的QWebView,所有问题都消失了。现在,它的行为与我所期望的WebView的行为完全一致。
缺点是,我需要手动将QWebView信号/时隙/属性公开给QML。(编辑:我通过拥有一个名为object的只读属性来解决这个问题,该属性返回set小部件。由于QObjects是自动转换为javascript可访问对象的,所以我可以访问web视图,以便执行如下:object.url = 'http://google.com'。为了方便起见,我还在QML对象上调用了init javascript函数,如果它存在,那么我只需在上面设置web视图--非常好!)
我提出问题后所做的另一个更改是将从C++切换到QML本身的“根对象”移动到QML本身,方法是创建一个具有C++ -callable javascript函数的全屏矩形,该矩形使用Qt.createComponent()加载“实际”QML文件并用anchors.fill锚定它。这样,逻辑(和对象的缓存)是在QML而不是C++中完成的,所以我可以简单地使用setSource(),让Qt句柄调整大小等等,我完全在QML中工作(至少对于应用程序的这一部分)。
发布于 2010-10-25 15:41:23
我不确定这是否会消除闪烁,但您可以在您的resizeEvent()中使用resizeEvent()
declarativeView->fitInView(object, Qt::IgnoreAspectRatio);https://stackoverflow.com/questions/4010290
复制相似问题