QT Slot funktioniert nicht, keine MsgBox aber this->close

Alles rund um die Programmierung mit Qt
Antworten
Meho
Beiträge: 16
Registriert: 24. September 2013 16:41

QT Slot funktioniert nicht, keine MsgBox aber this->close

Beitrag von Meho »

Halllo an alle,

ich habe ein kleines Problem, ich bin sicher es muss eine Kleinigkeit sein, nur leider finde ich den Fehler nicht! :-(

Ich habe mit dem Designer ein Widget zusammen geklickt, nun möchte ich die Funktionalitäten „hard“ coden.

Ich habe mir dazu 2 Slots geschrieben und möchte diese jetzt bei einem Button click starten.
Leider führt es die Anweisungen in den Slots nicht aus, ich bekomme aber auch keinen Fehler, weder beim Kompilieren noch zur Laufzeit.

Das witzige wenn ich in dem Slot eine MsgBox anzeigen lassen möchte funktioniert das nicht, die Anweisung this->close wird jedoch ausgeführt.

der Slot:

Code: Alles auswählen

void db_setting::foo()
{
    QMessageBox msgBox2;
    msgBox2.setWindowTitle("FOOO");
    msgBox2.setText(QString("ACHTUNG;\n HuggaBugga"));
    msgBox2.show();

    //this->close();

}
Slot im Header:

Code: Alles auswählen

private slots:
    void eingabeCheck();
    void foo();
und die Connect:

Code: Alles auswählen

 QObject::connect(ui->pbAbbrechen ,SIGNAL(clicked()),this,SLOT(foo()));
Danke schonmal für eure Hilfe!
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: QT Slot funktioniert nicht, keine MsgBox aber this->clos

Beitrag von Mr.Crank »

Tach Meho,

denke es ist ein Sender/Empfänger Fehler, probier mal folgendes:

msgBox2 = new QMessageox; //in der Funktion foo() statt QM...msgBox2;

und dann natürlich

connect(ui->pbAbbrechen,SIGNAL(clicked()),msgBox2,SLOT(foo()); // Dein Empfänger ist jetzt das Objekt msgBox2

Gruß MrCrank
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: QT Slot funktioniert nicht, keine MsgBox aber this->clos

Beitrag von hilefoks »

Moin,

verwende nicht show(), sondern exec() für die MessageBox.

Hintergrund: show() führt dazu das die MessageBox (oder ein anders QWidget) angezeigt werden, blockiert aber nicht. D.h. der Code hinter dieser Anweisung wird 'sofort' ausgeführt. Da deine MessageBox auf dem Stack abgelegt ist, wird sie nach dem this->close(), also beim Verlassen der Methode, auch gleich wieder gelöscht - und somit nie angezeigt. Mit exec() blockierst du die weitere Ausführung, bis die MessageBox geschlossen wurde. Erst danach wird der weitere Code in der Methode foo ausgeführt.

MfG,
Hilefoks
Meho
Beiträge: 16
Registriert: 24. September 2013 16:41

Re: QT Slot funktioniert nicht, keine MsgBox aber this->clos

Beitrag von Meho »

Hallo ihr beiden, vielen Dank für eure Antworten!

Die Lösung:
Tatsächlich zeigt er mir die QMessageBox an wenn ich sie auf dem Heap erzeuge, wieso das nicht anders geht frag ich mich aber schon ..?

so gehts!

Code: Alles auswählen

QMessageBox *msgBox2 = new QMessageBox();
msgBox2->setWindowTitle("FOOO");
msgBox2->setText(QString("ACHTUNG;\n HuggaBugga"));
msgBox2->show();
@ hilefoks
Ich habe das this->close teilweise auskommentiert und das ist ja auch schon die gekürzte Version, normaler weise steht da ja auch noch jede Menge anderer Quellkode.

Danke euch beiden, :-) an so einer Kleinigkeit kann man Tage verbringen, da hilft ein einfacher Rat/Idee manchmal sehr weiter!
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: QT Slot funktioniert nicht, keine MsgBox aber this->clos

Beitrag von Mr.Crank »

Hey Meho,

kein Problem dafür ist ein Forum da ;)

also mit deinem vorherigen Code hast du auch ein Objekt erzeugt, nur ist die Allokation des Objektes nur
solange im Stack bis ein } kommt. D.h. dein Fenster war vermutlich für ein Bruchteil einer Sekunde auf deinem
Bildschirm ^^ das Keyword new legt dein Objekt in den Heap und wird erst dann gelöscht wenn das Mutterobjekt
deleted wird (close()). New ist nicht immer schön bei Qt allerdings gang und gebe.

Ich empfehle dir, wenn du nur eine MessageBox inform einer Info oder der gleichen ausgeben möchtest, es wie
folgt zu implementieren:

void db_setting::foo()
{
QMessageBox::information(this, // nach dem :: hast du eine breite Auswahl an Massageboxen z.B. question , information usw.
tr("Titel_Ueberschrift"),
tr("Hier die Nachricht z.B. Like a boss ! ;)") );
}

einfach mal sonst schreiben was foo() für eine Aufgabe haben soll, denn kann man nochmal speziell drauf eingehen ;)
Meho
Beiträge: 16
Registriert: 24. September 2013 16:41

Re: QT Slot funktioniert nicht, keine MsgBox aber this->clos

Beitrag von Meho »

Hallo Mr.Crank

foilgender Kode

Code: Alles auswählen

QMessageBox::question ( this, "Achtung",
            "Bitte tragen sie in jedes Feld etwas ein!",
            QMessageBox::Ok );
funktioniert auch gut, so werde ich das am besten jetzt machen.

Ich hatte micr schon die ganzen Beispiele zu QMesageBoxen angeschaut, aber da kam nicht heraus welche Auswirkungen die unterschiedlichen Deklarationen haben. :roll:


Da du Stack und Heap erwähntest hätte ich gleich noch eine Frage dazu mach ich aber mal ein neuen Beitrag auf, da passt das besser!

Dankeschön! :-)

PS: Wo kann/muss/soll ich den Beitrag als gelöst markieren?
Antworten