Probleme mit QDialog

Alles rund um die Programmierung mit Qt
Antworten
bigmil
Beiträge: 23
Registriert: 18. Mai 2005 11:06

Probleme mit QDialog

Beitrag von bigmil »

Hallo zusammen,

ich habe folgendes Problem, bei dem ich nicht mehr weiter weiss.

Aus einem Widget (QUserWgt), rufe ich ein Dialog auf:

Code: Alles auswählen

void QUserWgt::addUser()
{
    QAddUserDlg addUserDlg( this );
    
    if ( addUserDlg.exec() )
    {
	QSqlQuery qUser;
	qUser.prepare( "INSERT INTO users ( name, surname, age, username, password ) "
		       "VALUES ( ?, ?, ?, ?, ? )" );
	qUser.addBindValue( addUserDlg.le_Name->text() );
	qUser.addBindValue( addUserDlg.le_Surname->text() );
	qUser.addBindValue( addUserDlg.getAge() );
	qUser.addBindValue( addUserDlg.le_UserName->text() );
	qUser.addBindValue( addUserDlg.le_Password1->text() );
	qUser.exec();
	
	dt_UserTable->refresh();
    }
	
}
In dem aufgerufenen Dialog (QAddUserDlg) habe ich verschiedene QLineEdit-Steuerelemente, die auf Benutzereingaben warten. Mit einem OK-Button schliesse ich dieses Dialog wieder und sende ein accept() dem aufrufendem Widget zu.

Nun sollte es mir doch möglich sein, auf die Steuerelemente zugreifen zu können.
In meiner Funktion mache ich dies z.B. mit addUserDlg.le_Name->text(). Leider reklamiert mir der Kompiler bei diesem Aufruf.

Code: Alles auswählen

form1.ui.h:23: error: `text' undeclared (first use this function)
form1.ui.h:23: error: (Each undeclared identifier is reported only once for each function it appears in.)
Meiner Meinung nach sollte dies aber so funktionieren. Habe in verschiedenen Qt-Büchern gecheckt, aber der Aufruf scheint io zu sein. Oder habe ich was übersehen? Mache ich was falsch?

Ich programmiere unter Linux SUSE 9.3 mit Qt 3.3.4. Kompiler ist der gcc.

Besten Dank für Eure Hilfe
Gruess
big4mil
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Das sieht mir nach einem fehlendem include aus. Mich wundert allerdings ein wenig, dass der Compiler den Fehler in einer .h Datei moniert - da hätte ich eigentlich keinen Methodenaufruf erwartet. Wie sieht denn die form1.ui.h aus?

Gruß Michael
bigmil
Beiträge: 23
Registriert: 18. Mai 2005 11:06

Beitrag von bigmil »

Hallo Michael,

besten Dank für Dein Feedback.

Ich muss die Kompiler-Fehlermeldung revidieren (quserwgt.ui.h anstatt form1.ui.h).

Code: Alles auswählen

userwgt.ui.h: In member function `virtual void QUserWgt::addUser()':
quserwgt.ui.h:19: error: `text' undeclared (first use this function)
quserwgt.ui.h:19: error: (Each undeclared identifier is reported only once for each function it appears in.)
Der Fehler bleibt aber der gleiche.

Nun zum eigentlichen Problem. Die Funktion text(), die den Fehler auslöst, ist ja "public member" des QLineEdit-Objects. Demnach sollte man auf diese Funktion ja zugreifen können, wenn man ein QLineEdit-Obejkt erzeugt hat. Dies mache ich ja z.B mit addUserDlg.le_Name->text(), wobei le_Name ein QLineEdit-Objekt im aufrufendem Dialog "addUserDlg" ist.

Ich muss vielleich noch erwähnen, dass ich mein Projekt mit dem Qt-Designer erstelle.

Ist dies ein Bug oder habe ich was übersehen? Komme hir echt nicht mehr weiter - kann mir das nicht erklären!

Gruess
big4mil
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Die Funktion text(), die den Fehler auslöst, ist ja "public member" des QLineEdit-Objects. Demnach sollte man auf diese Funktion ja zugreifen können, wenn man ein QLineEdit-Obejkt erzeugt hat.
Das Problem besteht darin, dass der Compiler zum Zeitpunkt der Übersetzung noch gar nicht "weiß", dass QLineEdit eine Member-Methode text() hat. Leider kenne ich den Aufbau der von Dir genannten Datei nicht. Ich vermute aber, dass irgendwo am Anfang der userwgt.ui.h eine Zeile in der Form

Code: Alles auswählen

class QLineEdit;
stehen wird. Damit wird dem Compiler lediglich mitgeteilt, dass irgendwo später in der Datei ein Objekt vom Typ QLineEdit deklariert wird, so dass er erst einmal nicht "meckert" wenn er auf die Zeile

Code: Alles auswählen

QLineEdit *le_Name;
stößt. Er geht nun einfach davon aus, dass ihm der genaue Aufbau des Objektes QLineEdit zu einem späteren Zeitpunkt mitgeteilt wird. Im entsprechenden cpp-File muss sich daher die Zeile

Code: Alles auswählen

#include qlineedit.h
finden, bevor auf eine Eigenschaft oder Methode des Objektes QLineEdit zugegriffen wird. Andernfalls wird es einen Compiler-Fehler geben.

Bei Dir wird dieser include wohl fehlen und deshalb bekommst Du die Meldung. Ich verstehe aber immer noch nicht, warum überhaupt in Deiner userwgt.ui.h der Methodenaufruf text() erfolgt. Die Implementation gehört in die cpp und nicht in die h-Datei.

Ich hoffe, das hilft Dir weiter.

Gruß Michael
bigmil
Beiträge: 23
Registriert: 18. Mai 2005 11:06

Beitrag von bigmil »

Hi Michael,

Meiner Meinung nach sollte es mit dem Aufruf addUserDlg.le_Name->text() auch ohne das inkludieren funkionieren, da ja das QLineEdit-Objekt bereits exisitert.

Anyway, habe im File, nun <qlineedit.h> in mein File inkludiert und nun erkennt er auch die Methode text();

Besten Dank für deinen Hinweis!

Gruess
big4mil
Antworten