У меня есть 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, хотя, возможно, я ошибаюсь.
У кого-нибудь есть идеи?