Redimensionando um qgraphicsItem para ocupar todo o espaço em um qgraphicsview, problemas quando a janela é redimensionada

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

Pergunta

eu tenho um QGraphicsItem (na verdade, um QDeclarativeItem) e eu quero que ocupe todo o espaço visível do QGraphicsView (novamente, é realmente o derivado QDeclarativeView classe) à qual foi adicionado. Normalmente, você pode usar QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView) e QDeclarativeView redimensionará automaticamente o objeto raiz para ajustar a visualização.

O problema que estou tendo é que estou criando manualmente o widget raiz usando

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

em vez de deixar QDeclarativeView faça isso automaticamente ligando setSource(). A razão pela qual estou fazendo isso é porque quero trocar a cena do QML quando certos eventos ocorrem, mas não quero destruir a cena anterior. Chamando setSource() exclui todos os itens que foram adicionados antes setSource() é chamado. Então, em vez disso, estou criando o "objeto raiz" e adicionando -o à cena manualmente.

Estou usando o Windows redimensioneEvent para redimensionar meu QDeclarativeItem, assim:

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

Isso funciona! Mas, não é muito bonito. Se você redimensionar a janela rapidamente, o QDeclarativeItem não é redimensionado com rapidez o suficiente e você vê brevemente um fundo cinza antes que ele o alcance e redimensione. Também não é muito suave.

Isso só acontece se eu tiver um item complexo sendo redimensionado (no meu caso, é um widget QWebkit). Funciona bem para itens mais simples. O problema é, no entanto, que se eu deixar QDeclarativeView Faça isso, não tenho nenhum desses problemas: é redimensionado corretamente e suavemente.

Imagino que isso não seja específico para as coisas qtdeclarativas, mas sim o QGraphicsView, embora talvez eu esteja errado lá.

Alguém tem alguma idéia?

Foi útil?

Solução 2

Eu resolvi meus problemas.

O problema parece estar com o elemento WebView da QML. Eu o alterei para um QGRAPHICSPROXYWIDGETGET registrado de C ++, com o widget definido para um QWebView normal e todos os problemas desaparecem. Agora se comporta exatamente como eu esperava que o WebView se comporte.

A desvantagem é que eu preciso expor manualmente os sinais/slots/slots/propriedades do QWebView ao QML. (Editar: Eu resolvi isso tendo uma propriedade somente leitura chamada object, que retorna o widget definido. Como os QObjects são convertidos automaticamente em objetos acessíveis a JavaScript, posso acessar a visualização da web, para exmaple, como este: object.url = 'http://google.com'. Por conveniência, também invoco uma função init javascript ont o objeto QML, se ele existir, então eu simplesmente defino a visualização da web lá - funciona muito bem!)

Outra alteração que fiz desde que fiz a pergunta é mover a mudança de "objeto raiz" do C ++ para o próprio QML, criando um retângulo de tela cheia com uma função JavaScript chama de C ++ que usa qt.createComponent () para carregar o qml "real" Arquive e ancorá -lo com ancors.fill. Dessa forma, a lógica (e o cache de objetos) é feita no QML, em vez de C ++, para que eu possa simplesmente definir o SetSource (), deixe o QT manipular redimensionar e tal e trabalho puramente no QML (para esta parte do aplicativo, de qualquer maneira).

Outras dicas

Não tenho certeza se isso vai se livrar do tremor, mas você pode usar fitInView na tua resizeEvent():

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top