Seite 1 von 1

QGraphicsView im Vollbild wird nach close nicht geschlossen

Verfasst: 10. Juni 2010 12:06
von t_b
Hallo,

meine in einen Dialog eingebettete QGraphicsView wird beim schießen des Dialoges nicht mitgeschlossen. auch ein close auf die view bringt nichts.
Auf folgende Weise rufe ich auf:

Code: Alles auswählen

void DemoArrowDialog::setFullScreenDemo()
{
    settings = gwd->saveGeometry();
    gwd->graphicsWidget->setListenKeyEvents(true);
    gwd->setContentsMargins(0,0,0,0);
    gwd->setModal(true);
    gwd->graphicsWidget->showFullScreen();
    gwd->showFullScreen();

    gwd->setFocus();
}
gwd ist hierbei der Dialog, welches das Widget graphicsWidget beinhalt.

Code: Alles auswählen

GraphicsWidgetDialog::GraphicsWidgetDialog(QWidget *parent) :
    QDialog(parent)
{
    graphicsWidget = new GraphicsWidget;
    QGridLayout *layout = new QGridLayout;
    layout->addWidget(graphicsWidget);
    layout->setContentsMargins(0,0,0,0);

    graphicsWidget->loadConfig();
    graphicsWidget->loadArrowConfig("Arrow");

    graphicsWidget->setArrowPosition(arrowPosition(arrowCenter));
    graphicsWidget->update();
    setLayout(layout);

    connect(graphicsWidget,SIGNAL(closeEvent()),this,SLOT(reject()));
}

das graphicsWidget beinhaltet die besagte View, welche folgendermaßen initialisiert wird:

Code: Alles auswählen

    scene = new QGraphicsScene;
    scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
    //scene->setSceneRect(0,0,resolution.x(),resolution.y());

    view = new QGraphicsView(scene);
    view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
    view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    view->setFrameStyle(QFrame::NoFrame);
    view->setBackgroundBrush(Qt::white);
    view->setRenderHints(QPainter::Antialiasing);
    view->setSceneRect(0,0,resolution.x(),resolution.y());
das GraphcisWidget reagiert auf Keyevents, so dass, wenn ich F11 drücke an den darüberliegenden Dialog closeEvent gesendet wird, welcher ein reject() auslöst (close() und accept() ebenfalls ausprobiert). Was dann passiert ist richtig merkwürdig, da zwar der GraphicsWidgetDialog geschlossen wird, das GraphicsWidget ansich aber bleibt. nur ein Strg+Alt+Entf bringt dieses zum verschwinden. Da die GraphicsView nach F11 auch nicht mehr auf Tasteneingaben reagiert, gehe ich davon aus, dass es ein Probem mit der View ansich handelt.

Verfasst: 10. Juni 2010 12:23
von upsala
Ohne parent's wird hier gar nichts gelöscht.

Verfasst: 10. Juni 2010 12:47
von t_b
Ich will ja auch nicht löschen, ich will ja nur, dass die View nicht mehr auf dem Bildschirm ist, und da der GraphicsWidgetDialog geschlossen wird, bin ich davon ausgegangen, dass die GraphicsWidget ebenfalls "geschlossen" wird, was ja auch mit gwd->showNormal() der Fall ist.

edit: was mir noch aufgefallen ist, die Ausgabe gibt nach schließen der Anwendung noch folgendes aus:

Code: Alles auswählen

QtOpenGL: Resources are still available at program shutdown.
          This is possibly caused by a leaked QGLWidget, 
          QGLFramebufferObject or QGLPixelBuffer.

Verfasst: 10. Juni 2010 19:20
von upsala
Dann übergib deinem QGraphicsWidget und deiner QGraphicsScene einen parent.

Verfasst: 11. Juni 2010 06:41
von t_b
Das hat leider nichts gebracht. Ich lade mal das Projekt hoch, vielleicht siehst du ja noch etwas anderes.

PS, es ist die 4.7 nötig, da ich den ElapsedTimer nutze.

Verfasst: 11. Juni 2010 07:13
von franzf
t_b hat geschrieben:PS, es ist die 4.7 nötig, da ich den ElapsedTimer nutze.
Das wird deine Chancen aber reduzieren, dass sich das jemand anschaut. Nicht jeder arbeitet schon mit der 4.7 Beta.
Für sowas schreibt man sich sowieso ein Minimalbeispiel, das vom ganzen Ballast der Programmlogik befreit ist, und sich nur auf das Wesentliche - die Konstellation, die zum Problem führt - beschränkt.

Verfasst: 11. Juni 2010 07:21
von t_b
Ich werde noch ein Minibeispiel machen, dauert aber noch ein bisschen.

Verfasst: 11. Juni 2010 08:42
von t_b
Minibeispiel erstellt, sollte auch mit QT < 4.7 laufen.

Die Taste zum schließen des Dialoges ist F11.

Verfasst: 14. Juni 2010 13:34
von t_b
Offensichtlich liegt es an dieser Zeile:

Code: Alles auswählen

view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
Ich setze hier den Viewport um QGL zu nutzen, aber offensichtlich scheint es damit Probleme zu geben.