Изменение размера QGRAPHICSITEM, чтобы взять все пространство в QGraphicsView, проблемы, когда окно изменяется

StackOverflow https://stackoverflow.com/questions/4010290

Вопрос

у меня есть 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() называется. Итак, вместо этого я сам создаю «корневой объект» и добавляю его на сцену вручную.

Я использую окна ресиметерь изменить размер моего 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 Сделайте это, у меня нет ни одна из этих проблем: его изменялось правильно и плавно.

Предлагаю, что это не специфично для QTDECLARARATIONATION, а скорее QGraphicsView, хотя, может быть, я там не так.

У кого-нибудь есть идеи?

Это было полезно?

Решение 2

Я решил свои проблемы.

Проблема, кажется, с элементом WebView QML. Я переключил его для QGraphicsProxywidget, зарегистрированного из C ++, с виджетом, установленным на обычный QWebView, и все проблемы исчезают. Теперь он ведет себя именно, как я ожидал вести себя ведут ведущий.

Недостатком является то, что мне нужно вручную разоблачать сигналы / слоты / слоты QWebView. (Редактировать: я решил это, имея свойство только для чтения object, который возвращает заданный виджет. Поскольку QObjects автоматически преобразуется в JavaScript доступные объекты, я могу получить доступ к веб-представлению, для Exmaple, как это: object.url = 'http://google.com'. Отказ Для удобства я также вызываю функцию init JavaScript Ont He QML Object, если он существует, так что я просто устанавливаю просмотр веб-сайта - отлично работает!)

Другое изменение, которое я сделал, поскольку я задал вопрос, это переместить «корневой объект» переключения с C ++ в самого QML, создав полноугольный прямоугольник с помощью функции C ++ -Sallable JavaScript, которая использует Qt.createComponent () для загрузки «фактического» QML Файл и закрепите его с анкерами. Таким образом, логика (и кэширование объектов) выполнена в QML, а не C ++, поэтому я могу просто настроить (), пусть Qt образует измерение изменений и таковых, и я работаю исключительно в QML (в любом случае, для этой части приложения).

Другие советы

Я не уверен, что избавится от мерцания, но вы можете использовать fitInView в твоем resizeEvent():

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top