Ridimensionamento di un QGraphicsItem per occupare tutto lo spazio in un QGraphicsView, problemi quando la finestra viene ridimensionata

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

Domanda

Ho un QGraphicsItem (in realtà, un QDeclarativeItem) e voglio che occupano l'intero spazio visibile della QGraphicsView (ancora una volta, la sua realtà la classe QDeclarativeView derivata) a cui è stato aggiunto. Normalmente, è possibile utilizzare QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView) e QDeclarativeView ridimensionerà automaticamente l'oggetto principale per adattare la vista.

Il problema che sto avendo è che sto creando manualmente la radice widget di usando

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

invece di lasciare QDeclarativeView farlo automaticamente chiamando setSource(). La ragione per cui sto facendo questo è perché voglio scambiare la scena QML quando si verificano determinati eventi, ma io non voglio distruggere la scena precedente. Chiamando setSource() elimina tutti gli elementi che sono stati aggiunti prima setSource() è chiamato. Così, invece sto creando l ' "oggetto radice" me stesso e aggiungerlo alla scena manualmente.

Sto usando le finestre resizeEvent per ridimensionare il mio QDeclarativeItem, in questo modo:

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

Questo funziona! Ma, non è molto carina. Se si ridimensiona la finestra in fretta, il QDeclarativeItem non viene ridimensionato abbastanza velocemente e si vede brevemente uno sfondo grigio prima che si raggiunge e lo ridimensiona. La sua anche non molto liscia.

Questo accade solo se ho un oggetto complesso di essere ridimensionata (nel mio caso, è un widget di QWebKit). Funziona bene per gli oggetti più semplici. Il fatto è, però, che se lascio QDeclarativeView farlo, non ho nessuno di questi problemi:. La sua ridimensionate correttamente e senza intoppi

Immagino che questo non è specifico per la roba QtDeclarative, ma piuttosto QGraphicsView, anche se forse mi sbaglio lì.

Qualcuno ha qualche idea?

È stato utile?

Soluzione 2

ho risolto i miei problemi.

Il problema sembra essere con elemento WebView di QML. Sono passato fuori per un QGraphicsProxyWidget registrato da C ++, con il widget set ad un QWebView normale e tutti i problemi scompaiono. Si comporta ora esattamente come mi aspettavo che il WebView comportarsi.

Lo svantaggio è che devo esporre manualmente i QWebView segnali / slot / proprietà alle QML. (EDIT:. Ho risolto questo avendo una proprietà di sola lettura chiamato object, che restituisce il set di widget di Da QObject vengono automagicamente convertiti in oggetti accessibili javascript, posso accedere alla visualizzazione Web, per exmaple, in questo modo:. object.url = 'http://google.com' per convenienza, ho anche invocare una funzione init javascript ont lui oggetto QML, se esiste, così ho semplicemente impostare la visualizzazione web lassù - grandi opere)

Un altro cambiamento che ho fatto da quando feci la domanda è quello di spostare la "oggetto radice" passaggio da C ++ in QML stesso, creando un fullscreen rettangolo con una funzione javascript C ++ -callable che utilizza Qt.createComponent () per caricare il " vero e proprio" file QML e di ancoraggio con anchors.fill. In questo modo la logica (e caching di oggetti) è fatto in QML, invece di C ++, così posso semplicemente setSource (), lasciate maniglia Qt ridimensionamento e tale e lavoro esclusivamente in QML (per questa parte del app, comunque).

Altri suggerimenti

Non sono sicuro se questo sarà sbarazzarsi del tremolio ma è possibile utilizzare fitInView nel vostro resizeEvent():

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top