Aktion eines Pushbutton wird nicht ausgeführt

Alles rund um die Programmierung mit Qt
Antworten
ralli
Beiträge: 45
Registriert: 28. September 2004 06:05

Aktion eines Pushbutton wird nicht ausgeführt

Beitrag von ralli »

Ich arbeite mit der Qt Open Source Edition Version 4.3.1 unter openSUSE 10.3 und der Qdevelop Version 0.24, und habe mir damit zum Einstieg in Qt ein neues Projekt Anwendung mit Hauptfenster einen kleinen Texteditor erstellt.

Dann habe ich im Projekt Explorer mit der rechten Maustaste den Menüpunkt Dialoge angeklickt und aus dem Kontextmenü Neues Element hinzufügen ausgewählt. Ich benötige einen neuen Dialog und habe die Datei infodlg.ui genannt. Im folgenden Widget habe ich QDialog ausgewählt.

Dann habe ich im Projekt Explorer unter Dialoge die ui/infodlg.ui markiert und und mit der rechten Maustaste aus dem Kontextmenu den Menüpunkt Dialog Implementierung aufgerufen um eine neue Klasse zu implementieren. Die vorgeschlagenen Dateinamen habe ich übernommen, der Klassenname ist DialogImpl und der Dateiname dialogimpl. Im folgenden Dialog Ableiten von Qt-Designer-Formularen habe ich den Button Erstellen angeklickt, worauf die Headerdatei dialogimpl.h und die Qellcode Datei dialogimp.cpp erstellt und zum Projekt hinzugefügt wurde.

Jetzt includiere ich die #include "ui_infodlg.h" in der mainwindowimpl.cpp und füge folgenden Code in der mainwindow imp.cpp hinzu:

Code: Alles auswählen

void MainWindowImpl::on_action_ber_RG_Text_triggered()
{
// Dialog ableiten
QDialog *infodlg = new QDialog;
// Aufruf durch den in dem Formular vergebenen Klassennamen
Ui::Dialog ui;
ui.setupUi(infodlg);
infodlg->show();
infodlg->exec();
}
Jetzt und compiliere das ganze. Wenn ich den Menüpunkt Über RG Text aufrufe, erscheint auch artig der neue Dialog. Also bis hier funktioniert das Ganze.

Jetzt öffne ich den neuen Dialog infodlg.ui im Designer und entferne das Label und die Buttonbox, weil ich jetzt einen eigenen Pushbutton erstellen will. Ich füge einen Pushbutton hinzu und beschrifte ihn mit Beenden. Den Objectnamen des Pushbutton ändere ich auf pb_beenden und speichere ab und verlasse den Designer.

So, im Qdevelop zurück markiere ich im Objektexplorer unter Dialoge die ui/infodlg.ui und wähle aus dem Kontextmenu wieder Dialogimplementierung. Dann wähle ich on_pb_beenden_clicked() und klicke aktualisieren. Er erzeugt eine Auto Connection wo ich in der Datei dialogimpl.cpp folgenden Code einfüge:

Code: Alles auswählen

void DialogImpl::on_pb_beenden_clicked()
{
close();
}
Jetzt comiliere ich erneut und der Compiler läuft durch, ohne zu meckern.

Aber wenn ich den Pushbutton im Neuen Dialog anklicke, passiert nichts, das Widget sollte ja geschlossen werden. Irgendwo habe ich da einen Denkfehler. Bis zu diesem Punkt habe ich mir alles selbst erarbeitet, weil ich einen kleinen Tutor zur Einführung schreiben will, damit es Umsteiger von Delphi (wie ich) es in Zukunft etwas einfacher haben. Was mache ich falsch ?
Ich habe schon stundenlang im Assistanten gelesen und mir Beispielcode angeschaut, gegoogelt, ich finde den Fehler nicht weil, es wohl ein Denkfehler von mir ist. Irgendwas habe ich nicht richtig verstanden. Ich möchte den Qdevelop weiter benutzen, weil ich damit zufrieden bin.

ralli
Arch Linux - Openbox: CPU: P4 3,0 - RAM: 2048 MB - Graka: Nvidia Geforce 9500 GT 1024 MB mit aktuellem Nvidia Treiber - HDD: 250 GB und 1 TB - Qt 4.7.0 - QtCreator 2.01
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Versuche es mal ohne autoconnect und/oder schaue was zur Laufzeit auf der Konsole ausgegeben wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ralli
Beiträge: 45
Registriert: 28. September 2004 06:05

Beitrag von ralli »

Also, ich habe es schon mit autoconnect versucht. Es kommt in der Debug Konsole folgende Ausgabe:

Läuft...
Qt: Cannot set locale modifiers:

Ansonsten ist die Reaktion auf den Click des Pushbutton die gleiche, es passiert nichts. Ein Mainwindwow mit einer Menüleiste , von der ein Dialog aufgerufen wird, ist doch in 2 Minuten zusammengeklickt, was stimmt hier nicht ? Kann das bitte mal einer verifizieren. Ich habe das Projekt mal als Zip Archiv angehangen.

ralli
Dateianhänge
rgtext.zip
(106.79 KiB) 183-mal heruntergeladen
Arch Linux - Openbox: CPU: P4 3,0 - RAM: 2048 MB - Graka: Nvidia Geforce 9500 GT 1024 MB mit aktuellem Nvidia Treiber - HDD: 250 GB und 1 TB - Qt 4.7.0 - QtCreator 2.01
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schon mal mit einem Debugger oder passenden qDebug-Aufrufen überprüft, ob der Konstruktur von DialogImpl jemals aufgerufen wird?

Ein bißchen Codeformatierung (Einrückungen!) hat auch noch niemand geschadet...
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

So kann das auch nicht funktionieren, denn wenn Du von QDialog ableitest statt von DialogImpl, wird der Konstruktor niemals aufgerufen. Und ohne Konstruktor kein connect.

Gruß Michael
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du Spielverderber, laß ihn doch noch ein bißchen selbst suchen...
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Sorry, hatte nicht gesehen, dass Du schon geantwortet hattest.
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

is ja nicht gar so schlimm mit'm verraten ... das 'suchspiel' hat ja noch nen zweites level. :twisted: auch wen das deutlich leichter ist. :lol:


Obel
ralli
Beiträge: 45
Registriert: 28. September 2004 06:05

Beitrag von ralli »

Schön, das Ihr Euch über mich lustig macht. Ich fühl mich wirklich gut dabei. Ich bin kein It Neuling. Ich habe schon vor 34 Jahren als Operator gearbeitet, damals noch mit Lochkarten. Dann Basic und Pascal gelernt. Grosse Projekte allein mit dbase und Clipper alleinverantwortlich durchgezogen. Bestimmt weit über zweitausend Menschen begleitet bei Ihren ersten Schritten in die EDV . Dann 1996 Delphi und Objektpascal gelernt. Durch Linux auf Freepascal und Lazarus umgestiegen. Und habe dieser Communtiy 2 Programme dbmaker für Windows und für Linux mit Sourcecode zum Lernen geschenkt, die unter www.rgsoftware.de heruntergeladen werden können. Weil Lazarus noch sehr buggy ist, bin ich letztendlich bei Qt gelandet. Ich habe kein Informatikstudium, sondern habe mir alles selbst beigebracht. Aber 22 Jahre Erfahrung in der Erwachsenenbildung und als IT Dozent gearbeitet. Bis heute habe ich jedes kleinste, banale Problem eines Einsteigers ernst genommen. Es gibt wirklich keine dummen Fragen, sondern nur dumme Antworten. Ich habe mich sehr schnell und ausreichend in Qt eingearbeitet, auch einen guten C++ Kurs durchgearbeitet, mir stundenlang Codeschnippsel angeschaut und dadurch vieles gelernt. Aber an dieser Stelle komme ich nicht weiter. Auch muss ich noch lernen, mit dem Debugger umzugehen, das ist noch absolutes Neuland für mich. Von Qt und seiner umfangreichen Klassenbibliothek, seiner Schnelligkeit und Stabilität bin ich wirklich begeistert. Aber ich finde trotzdem den Fehler nicht, bitte korrigiert meinen Code, damit ich das endlich nachvollziehen kann und zwar vernünftig erklärt. Ich habe mir das Qt Buch von Jürgen Wolf gekauft, gegoogelt, keine einziges wirklich gutes Beispiel gefunden, wie SubClassing so erklärt wird, das es auch gut verstanden wird. Und auch im Forum ist ja dieses Problem öfters schon aufgetaucht. Also, ich bitte noch einmal darum, mir das Schritt für Schritt zu erklären, was ich wo verkehrt gemacht habe und bitte auch, was für ein Code an dieser Stelle stehen müsste, damit das ganze funktioniert. Ich habe ganz gewiss Humor, bin aber nicht zur Belustigung hier und tauge nicht zum Gespött der anderen.

Also für Eure Hilfe wäre ich sehr dankbar, weil ich es alleine nicht schaffe.

Danke

ralli
Arch Linux - Openbox: CPU: P4 3,0 - RAM: 2048 MB - Graka: Nvidia Geforce 9500 GT 1024 MB mit aktuellem Nvidia Treiber - HDD: 250 GB und 1 TB - Qt 4.7.0 - QtCreator 2.01
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Hallo,

nun sei mal nicht so eingeschnappt, denn von upsala hast Du einen Hinweis bekommen, wie Du Dich der Lösung Deines Problems nähern kannst, und von mir hast Du sie schon fast auf dem Tablett serviert bekommen:

Das Connect-Kommando hast Du im Konstruktur Deiner Klasse DialogImpl stehen. Wenn Du diesen - wie von upsala vorgeschlagen - um eine qDebug-Ausgabe erweitern

Code: Alles auswählen

DialogImpl::DialogImpl( QWidget * parent, Qt::WFlags f) 
	: QDialog(parent, f)
{
	setupUi(this);
        connect( pb_beenden, SIGNAL(triggered(bool)), this, SLOT(ende()));
        qDebug("Der Konstruktor wird ausgeführt");

}
und das Programm in der Konsole ausführen würdest, würdest Du sehen, dass keine Debug-Ausgabe erfolgt. Folglich wird der Konstruktor nicht ausgeführt. Warum das nicht der Fall ist, habe ich Dir bereits gesagt:

Code: Alles auswählen

void MainWindowImpl::on_action_ber_RG_Text_triggered()
{

// Dialog ableiten

QDialog *infodlg = new QDialog;

Du leitest Dein Dialogfenster von QDialog ab, wie soll da der Konstruktor von DialogImpl aufgerufen werden?

Außerdem solltest Du einmal einen Blick in die QT-Doku werfen, welche Signals die QPushButton-Klasse hat.

Damit solltest Du jetzt genügend Hinweise zur Lösung Deines Problems haben.

Gruß Michael
ralli
Beiträge: 45
Registriert: 28. September 2004 06:05

Beitrag von ralli »

Danke Michael,
ja es nervt gewaltig, wenn ich an einer Stelle nicht weiter komme, weil ich ein Brett vor dem Kopf hatte.
Also, ich werde ansonsten Eure gut gemeinten Empfehlungen annehmen. Quelltext formatieren.. Eigentlich bin ich ganz zufrieden, was ich in den letzten 14 Tagen gelernt habe. Die ersten Programme habe ich zu Fuß geschrieben mit Kate. Und dabei hat mir das Buch von Jürgen Wolf " QT 4 GUI Entwicklung mit C++" weitergeholfen.

Code: Alles auswählen

...
// Dialog ableiten

DialogImpl *infodlg = new DialogImpl;  

// Aufruf meiner Klasse

infodlg->show();

infodlg->exec();
...
So wenn ich jetzt noch wüsste, wie der Thread als gelöst markiert wird..
Also, alles läuft und ich werde jetzt weiter im Assistant wühlen und mir eine Übersicht über die Eigenschaften und Methoden der wichtigsten Klassen verschaffen. angefangen habe ich damit aber schon.
ralli
Arch Linux - Openbox: CPU: P4 3,0 - RAM: 2048 MB - Graka: Nvidia Geforce 9500 GT 1024 MB mit aktuellem Nvidia Treiber - HDD: 250 GB und 1 TB - Qt 4.7.0 - QtCreator 2.01
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

@ralli :

also das war wirklich nicht als 'lustig machen' gemeint !!! nicht von mir und sicher auch nicht von den anderen.
upsala hatte dich ja auf den richtigen weg geschickt und MichaelS hat das problem dann doch eigentlich exakt erklärt. ich hätte sonst auch nur geschrieben, daß dein About-Dialog nur ein QDialog ist der wie dein DialogImpl aussieht, aber QDialog nunmal nicht deine in der DialogImpl-klasse implemantierten slots kennt.

ich finde, daß es meist besser ist, jemanden der sich gerade in etwas neues einarbeitet, nicht direkt die lösung zu zeigen, sondern ihm dabei zu helfen diese selber zu finden. ihn also aus der sackgasse oder dem abweg zu nehmen und ihn in die richtige richtung zu schicken. als IT-ausbilder wirst du das sicher auch kennen.

darum hab ich den fehler mit dem 'triggered'-signal auch nicht 'verraten', sondern nur d'rauf hingewiesen, daß da noch was falsch ist bevor es funzt.

also nochmal sorry von mir, daß du dir verkohlt vorgekommen bist, weil ich das etwas salopp formuliert habe. :oops:

MfG Obel

PS: titel kannst du ändern, indem du für deinen ersten beitrag auf 'edit' gehst und dort den titel-text ergänzt.
ralli
Beiträge: 45
Registriert: 28. September 2004 06:05

Beitrag von ralli »

Hallo @Obelix, ich bin nicht nachtragend und war gestern wohl auch nach einem langen Arbeitstag ein wenig gestresst. Eure Vorgehensweise ist schon ok, ja eigentlich ist sie ja pädagogisch wertvoll, weil sie ja zum Mitmachen und Nachdenken einlädt. :D

Also, alles ist ok, so empfindlich bin ich nicht, ein alter EDV Fahrensmann, der in 57 Jahren durch so manches durchgeschippert ist. Aber Qt gefällt mir sehr gut, und ich denke das ich hier eine neue (Programmierheimat) gefunden habe.

ralli
Arch Linux - Openbox: CPU: P4 3,0 - RAM: 2048 MB - Graka: Nvidia Geforce 9500 GT 1024 MB mit aktuellem Nvidia Treiber - HDD: 250 GB und 1 TB - Qt 4.7.0 - QtCreator 2.01
Antworten