[gelöst] QWidget automatisch schliessen

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] QWidget automatisch schliessen

Beitrag von 24dan »

Hi, wie kann ich mein QWidget foo() automatisch schliessen wenn der Benutzer es offensichtlich nicht braucht?

Bisher habe ich meinem Widget foo() eine Funktion zum manuellem Schliessen verpasst.

Idee zur Lösung:
Das QEvent::Enter (Mouse enters widget's boundaries) und QEvent::Leave abzufangen, um mitzubekommen das der Benutzer aus dem Bereich des Widget foo ausgetreten ist ohne was zu machen. Dann also close().

Problem: Bekomme das Event::Enter oder Leave nicht zu sehen.

Code: Alles auswählen

/*! MouseMove fuer das Bewegen des Fensters
\param event QMouseEvent Mouse Event
*/
void Navigation::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<"MouseMove:"<<event->type();
}


void Navigation::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);

    // Event überhaupt vorhanden?
    qDebug()<<"ChangeEvent:"<<e->type();

    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
  • Ausgabe :
    ChangeEvent: 39 Palette of the widget changed.
    ChangeEvent: 39
    ChangeEvent: 99 A widget's top-level window activation state has changed.
    MouseMove: 5
    .
    .
    .
    MouseMove: 5
    ChangeEvent: 99
Zuletzt geändert von 24dan am 2. Mai 2010 14:18, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag von Chris81T »

Also ich würd mal behaupten, du nutzt die falsche Event-Funktion. Die mouseMoveEvent wird ja auch "nur" ausgelöst, wenn die Maus sich über das Widget bewegt. Man könnte da manuell Positionsberechnungen reinbauen um festzustellen, ob die Maus sich noch über dem Widget befindet, aber das ist überhaupt nicht nötig!

Denn Qt -> QWidget bietet dir die Funktion enterEvent(QEvent*) und leaveEvent(QEvent*) an. Die leaveEvent() solltest du dir mal anschauen.

Noch ein Tip direkt hinterher: Wenn du wirklich das Widget plattmachen willst, weil der User dieses mit der Maus verlääst, nutze bitte dann die deleteLater() Funktion, denn es kann ja gut möglich sein, dass im Event-"Stack" noch andere Funktionen was auf dem Widget machen wollen und dann würde es knallen, wenn du einfach mit delete den Speicher wieder freigegeben hast.

Viel Erfolg.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Und für was denkst du gibt es QWidget::enterEvent() und QWidget::leaveEvent()?
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

@Beide hab ich Übersehen.... :oops:

@Chris81T benutze nur ein close() im foo() und im Hauptprogramm wieder ein show(); foo() wird aber beim Start der Hauptanwendung als Kind davon erstellt. Somit auch beim Schliessen erst deleted.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag von Chris81T »

@Chris81T benutze nur ein close() im foo() und im Hauptprogramm wieder ein show(); f
Oh, ich hab mich da bei dir verlesen. Du hattest ja geschrieben, dass du das Widget schließen willst. Hab irgendwie löschen im Kopf gehabt.. 8) Na dann ist ja gut...
Antworten