QGraphicsView im Vollbild wird nach close nicht geschlossen

Alles rund um die Programmierung mit Qt
Antworten
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

QGraphicsView im Vollbild wird nach close nicht geschlossen

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ohne parent's wird hier gar nichts gelöscht.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann übergib deinem QGraphicsWidget und deiner QGraphicsScene einen parent.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
Zuletzt geändert von t_b am 11. Juni 2010 13:51, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag von t_b »

Ich werde noch ein Minibeispiel machen, dauert aber noch ein bisschen.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag von t_b »

Minibeispiel erstellt, sollte auch mit QT < 4.7 laufen.

Die Taste zum schließen des Dialoges ist F11.
Dateianhänge
DemoProjekt.7z
(11.14 KiB) 135-mal heruntergeladen
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
Antworten