Label sichtbar->unsichtbar->sichtbar

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
kannaum
Beiträge: 73
Registriert: 31. Januar 2010 09:57

Label sichtbar->unsichtbar->sichtbar

Beitrag von kannaum »

Erstmal hoffe ich, dass der Titel ein bisschen verständlich ist, mir fiehl sonst ncihts ein, wie ich es beschreiben sollte.

Ich habe ein QLabel mit einer QPixmap darin.
Nun will ich durch einen Klick auf einen QToolButton das Label und somit das Bild ausblenden, was auch gut funktioniert.
Bei einem weiteren Klick auf den Button soll dann das Bild für eine halbe Sekunde angezeigt werden.

Habe das zuerst mit einem QTimer proiert, bekam aber dann viel zu viele Funktionen und Slots zusammen.
Jetzt will folgendes beim zweiten Klick machen:
Label einblenden.
Programm für eine halbe Sekunde "pausieren lassen" und dann wieder ausblenden.

Hier mein Code mit dem ich das versucht habe:

Zuerst mein ToolButton:

Code: Alles auswählen

//Erzeugung von QtoolButton
        anzahl = 0;
        mikro = new QToolButton(this);
        connect(mikro, SIGNAL(clicked()), this, SLOT(MikroMeth()));
Und jetzt noch mein Slot:

Code: Alles auswählen

    void MikroMeth() {
        if(anzahl == 0) {
            label->setVisible(false);
            anzahl = 1;
        } else if(anzahl == 1) {
            label->setVisible(true);
            Sleep(500);
            label->setVisible(false);
            anzahl = 0;
        }
    }
Ich bekomme keine Fehlermeldung oder andere Sachen.
Es tut sich einfach nichts.

mfg
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Du musst Deiner Software auch die Chance geben, das Label aus- und einzublenden, also die GUI zu aktualisieren.
Momentan passiert folgendes:
Label ausblenden -> 0,5 s warten -> Label einblenden -> GUI aktualisieren.
Du Siehst also nix.
Du musst also nach dem ausblenden ein processEvents() aufrufen, dann passiert auch was.

BTW: Es ist kein guter Stil, die komplette Applikation mit sleep pausieren zu lassen.
Linux, das längste Text-Adventure aller Zeiten
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

sleep ist quatsch (jedenfalls in dieser Anwendung). QTimer ist der richtige Weg..


Beispiel für einen SingleShot:
http://doc.qt.nokia.com/4.7/qtimer.html#singleShot

Falls dir der SingleShot zuwenig Kontrollmöglichkeiten bietet (weil z.B. bei einem Klick innerhalb der 500ms-Wartezeit nichts weiter geschehen soll.. wie bei einem Memory-Spiel), dann nimmst du halt einen QTimer als Member...
Wieso denn "viel zu viele Funktionen und Slots"?
kannaum
Beiträge: 73
Registriert: 31. Januar 2010 09:57

Beitrag von kannaum »

Ok vielen Dank.
Zum sleep:
Ich weiß, dass es ein sehr schlechter Stil ist, aber ich dachte eine halbe Sekunde wäre zu verkraften.

@solarix:
Bei einem QTimer muss ich ja einen Slot wählen oder?
Das wäre bei dieser Funktion kein Problem, aber ich habe nochmal eine ähnliche FUnktion und dort bräuchte ich dann einen eigenen Slot zum einblenden, ausblenden etc. und das hat sich sehr summiert.
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

kannaum hat geschrieben: Ich weiß, dass es ein sehr schlechter Stil ist, aber ich dachte eine halbe Sekunde wäre zu verkraften.
Flasch. 500 ms ist für einen Processor eine sehr sehr sehr lange Zeit.
kannaum hat geschrieben: @solarix:
Bei einem QTimer muss ich ja einen Slot wählen oder?
Das wäre bei dieser Funktion kein Problem, aber ich habe nochmal eine ähnliche FUnktion und dort bräuchte ich dann einen eigenen Slot zum einblenden, ausblenden etc. und das hat sich sehr summiert.
Den Timer kannst Du doch für beide Funktionen verwenden.
Linux, das längste Text-Adventure aller Zeiten
kannaum
Beiträge: 73
Registriert: 31. Januar 2010 09:57

Beitrag von kannaum »

Ok werde dann die Sleeps mal ersetzen wenn ich Zeit habe, erstmal ist mit wichtig, dass es überhaupt funktioniert, dann geht´s ans Finetuning ;-)

Habe eine zweite Funktion, die das Label für ein paar Sekunden ausblenden soll und dann wieder kurz für eine halbe Sekunde einblenden soll.
Die Sekunden habe ich diesmal aber mit singleShot gemacht:

Code: Alles auswählen

    void MikroMeth2() {
            label->setVisible(false);
            QTimer::singleShot(5000, this, SLOT(ShowPicture()));
            Sleep(500);
            label->setVisible(false);
    }
ShowPicture():

Code: Alles auswählen

    void ShowPicture() {
        label->setVisible(true);
    }
Leider geht das nicht.
Habe auch schon in jede Zeile ein QCoreApplication::processEvents();
gegeben, was aber auch nicht, wie beim ersten Problem, funktioniert hat.

Was ist denn daran falsch?
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Du hast wieder ein Sleep. Never do this again!!!
Deine App schläft für 500 ms, in dieser Zeit macht sie NICHTS. Also keinen Timer starten, keine Events abarbeiten, rein garnixhts eben.

Du solltest vielleicht mal von dem ablauforientierten Denken verabschieden und Dich mit Events, Threads, Nebenläufigkeit, usw beschäftigen.
Bei einem modernen Betriebssystem laufen viele Sachen parallel.
Ein Timer erzeugt z.B. einen eigenen Thread, der Funktionen (Callback) aus Deinem Programm aufruft. Wenn dieses Schlafen geht, kann nix passieren.
Linux, das längste Text-Adventure aller Zeiten
kannaum
Beiträge: 73
Registriert: 31. Januar 2010 09:57

Beitrag von kannaum »

Ok, kam jetzt mit der SIngleShot Funktion etwas durcheinander.
Das Programm läuft jetzt einwandfrei, Danke!

Und damit ihr heute in Ruhe Schlafen gehen könnt bin ich auch gerade dabei die Sleeps auszutauschen.

mfg
Antworten