Seite 1 von 2

gelöst: Signals und Slots?? Hilfe zu Connect

Verfasst: 29. Oktober 2008 13:30
von nici
Hallo Leute,

Habe seit 1 woche die Aufgabe mit dem QT ein Mainwindow zu erstellen, dass 3 Zahlen zusammenrechnet und ausgibt. (ich muss gestehen, dass ich neu auf dem Gebiet bin)

ich habe es geschafft das erste Feld abzuprüfen und eine Fehlermeldung auszugeben wenn keine gültige Zahl eingegeben wurde.

Jetzt komme ich leider nicht weiter.

MainWindow.cpp

Code: Alles auswählen

#include <QtGui>
#include "MainWindow.h"

MainWindow::MainWindow(QMainWindow *parent) 
		:QMainWindow(parent)
	{
		setupUi(this);
		
		connect(calcPB, SIGNAL(clicked()), this,  SLOT(calc()));	
                  
        connect(output,SIGNAL(clicked()), this, SLOT(showErg()));
	}
		
void MainWindow::calc() {

int zahl_1=0 ,zahl_2=0, zahl_3=0;
// int erg=0;
bool ok=false;

zahl_1 = input_1->text().toInt(&ok);
// zahl_2 = input_2->text().toInt(&ok);
// zahl_3 = input_3->text().toInt(&ok);


if(ok==false){
		showConvError (input_1->text(),QString("1"))		
		
}else {
		qDebug()<<"alles Ok";
	  }
}

void MainWindow::showConvError(const QString & value, const QString & inputNumber ){
			
QMessageBox::warning(this, "Warnung", "Der von Ihnen eingegebene Wert \"" + value + "\" im Feld \"" + inputNumber + "\" ist ungueltig.");
}

//void MainWindow::showErg(const QString & value ){
	
	//QLineEdit erg;
	//erg.input_1->text();
//}
-------------------------------------------------------------------------------

Code: Alles auswählen

MainWindow.h

//}#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_MainWindow.h"

class MainWindow : public QMainWindow , private Ui::MainWindow
{
	Q_OBJECT
	
	public:
		MainWindow(QMainWindow *parent=0);
		
		
	public slots:
			void calc();
			void showConvError(const QString &, const QString & );
			void showErg(const QString &);
			
	
		};
#endif
-------------------------------------------------------------------------

Code: Alles auswählen

Main.cpp

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
	QApplication app(argc,argv);
	
	MainWindow mw;
	mw.show();
	return app.exec();
	
	}

Kann mir bitte jemand weiterhelfen??

lg

nici

Verfasst: 29. Oktober 2008 13:36
von jerry42
Hallo,

mir ist dein Problem leider nicht ganz klar.
Was hindert dich daran die zwei weiteren Felder zu überprüfen?
Bekommst du eine Fehlermeldung?

Wenn man weiß, wo es hakt dann kann man Dir sicher besser helfen.

Gruß jerry42

Verfasst: 29. Oktober 2008 13:41
von nici
naja ich weiss nicht wie ich die beiden anderen Felder überprüfe und wie ich alle drei Werte zusammenrechen soll und ausgeben soll. wie gesagt, ich bin völlig neu auf dem Gebiet und bin auch nicht so Programmierstark ^^

Jetzt im Moment hab ich aber das Problem das ich das Programm nicht ausführen kann, weil die ./calsN weg ist.

lg

nici

Verfasst: 29. Oktober 2008 13:51
von jerry42
Du willst also alle drei Textfelder prüfen.
Wenn du genau wissen willst, welches nicht korrekt war, dann benötigst du auch drei bool-Veriablen. Also zB ok1, ok2,ok3

Und dann kannst du anschließend jede einzelne bool-Variable prüfen, ob sie true oder false ist, und dann entsprechend eine Nachricht an den Benutzer schicken.

Hilft das weiter?

edit: Achja, was meinst du mit ./calsN ?

Verfasst: 29. Oktober 2008 13:56
von nici
ja danke das hilft mir weiter, ich probiers aus, wenn ich wieder eine ausführbare Datei habe ^^.

lg

nici

Verfasst: 29. Oktober 2008 14:42
von nici
hey cool das mit ok1,ok2,ok3 hat geklappt. Danke.

kann ich denn dann sagen

if((zahl2!=0)&&(zahl2!=0)&&(zahl3!=0)){

ergebnis = zahl1+zahl2+zahl3;
}

Wenn ja wie übergebe ich die summe meinem output??

Muss ich extra eine Methode void MainWindow::showErg( const QString & value){
//was hier hin kommen soll weiss ich auch nicht

}
machen ?????

lg

nici

Verfasst: 29. Oktober 2008 14:59
von jerry42
naja also von der Syntax ist das natürlich korrekt. Aber ich weiß nich, ob du wirklich das haben willst.
Im Moment heißt deine if-Abfrage soviel wie: Wenn zahl1 ungleich 0 UND zahl2 ungleich 0 UND zahl3 ungleich 0, dann mach irgendwas.

Für die Addition würde ja eine Zahl 0 nichts ausmachen.

Vielleicht meinst du das:

Code: Alles auswählen

 if(ok1&&ok2&&ok3) {
ergebnis = zahl1  + zahl2 + zahl3;
}
was du nun mit dem Ergebnis anfängst hängt nun stark davon ab, wie du das Ergebnis anzeigen willst. Hast du dafür auch ein QLineEdit? dann könntest du folgendes machen:

Code: Alles auswählen

 if(ok1&&ok2&&ok3) {
ergebnis = zahl1  + zahl2 + zahl3;
lineEdit_Ergebnis.setText(QString::number(ergebnis));
}
oder so ähnlich. :)
Ansonsten musst du es eben in eine Nachricht bauen, so ähnlich wie deine Fehlernachrichten.

Gruß jerry42

Verfasst: 29. Oktober 2008 15:41
von nici
hi,

ja ich benutze lineEdit, in meinem Qt-designer heisst das Feld ''output''.
Ich bekomme leider eine Fehlermeldung:
'' request for member 'setText' in '((MainWindow*)this)->MainWindow::<anonymout>.Ui::MainWindow::<anonymous>.Ui_MainWindow::output' , whichist of non-class type 'QlindeEdit*' „

Leider verstehe ich diese Fehlermeldung nicht ganz.

Verfasst: 29. Oktober 2008 15:44
von jerry42
Wenn du nochmal deinen aktuellen Code posten würdest, dann sieht man bestimmt wo der Fehler liegt.

Verfasst: 29. Oktober 2008 15:47
von nici
MainWindow.cpp

Code: Alles auswählen

#include <QtGui>

#include "MainWindow.h"

MainWindow::MainWindow(QMainWindow *parent) 
		:QMainWindow(parent)
	{
		setupUi(this);
		
		connect(calcPB, SIGNAL(clicked()),
                  this,  SLOT(calc()));	
                  
        connect(output,SIGNAL(clicked()),
				this, SLOT(showErg()));
	}
		
void MainWindow::calc() {

int zahl1=0 ,zahl2=0, zahl3=0;
 int erg=0;
bool ok1=false;
bool ok2=false;
bool ok3=false;

zahl1 = input_1->text().toInt(&ok1);
zahl2 = input_2->text().toInt(&ok2);
zahl3 = input_3->text().toInt(&ok3);


	if(  ok1==false  ){
		showConvError (input_1->text(),QString("1")); 
}
	if(ok2==false){
		showConvError(input_2->text(),QString("2"));
}
	if(ok3==false){
		showConvError(input_3->text(),QString("3"));
		
}else {
		qDebug()<<"alles Ok";
	  }

	if(ok1 && ok2 && ok3)
{
		erg=zahl1 + zahl2 + zahl3;
		output.setText(QString::number(erg));
}
	}

void MainWindow::showConvError(const QString & value, const QString & inputNumber ){
			
	QMessageBox::warning(this, "Warnung", "Der von Ihnen eingegebene Wert \"" + value + "\" im Feld \"" + inputNumber + "\" ist ungueltig.");
}
------------------------------------------------------------
MainWindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_MainWindow.h"

class MainWindow : public QMainWindow , private Ui::MainWindow
{
	Q_OBJECT
	
	public:
		MainWindow(QMainWindow *parent=0);
		
		
	public slots:
			void calc();
			void showConvError(const QString &, const QString & );
			//void showErg(const QString &);
			
	
		};
#endif
------------------------------------
main.cpp

#

Code: Alles auswählen

include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
	QApplication app(argc,argv);
	
	MainWindow mw;
	mw.show();
	return app.exec();
	
	}
lg

nici[/code]

Verfasst: 29. Oktober 2008 15:55
von jerry42
deine Variable output wird wohl ein Pointer sein.
Du musst also setText entsprechend aufrufen:

Code: Alles auswählen

output->setText(...)
Was mir noch auffällt ist, deine If Schleife zur Prüfung.

Code: Alles auswählen

   if(  ok1==false  ){
      showConvError (input_1->text(),QString("1"));
}
   if(ok2==false){
      showConvError(input_2->text(),QString("2"));
}
   if(ok3==false){
      showConvError(input_3->text(),QString("3"));
      
}else {
      qDebug()<<"alles Ok";
     } 
Dein Else-Teil bezieht sich nur auf das letzte if.
D.h. Auch wenn ok1 und ok2 false sind, solange ok3 true ist, wird dein "alles ok" ausgegeben.

Du könntest entweder eine vierte bool-Variable benutzen und sobald eine Überprüfung false ergibt diese dann mit auf false setzen, und diese dann als Endüberprüfung abfragen.
Oder du verschachtelst deine If abfragen ineinander. dann kommst du zB nur in die innerste Schleife wenn alle OK waren.

Gruß jerry42

Verfasst: 29. Oktober 2008 16:05
von nici
hi,

ja hattest Recht, output ist ein Pointer. Jetzt funktioniert die Ausgabe.

Aber wie meinst du das mit der if-Anweisung?

soll ich noch ein ''bool ok4=false;'' machen

und dann abfragen

if(ok4==false){
// ähm was dann??
}

lg

nici

Verfasst: 29. Oktober 2008 16:14
von jerry42
Verstehst du warum die Abfrage so nicht einwandfrei funktioniert?

Ich meine es letztlich so:

Variante 1)

Code: Alles auswählen

bool allesOK = true;

if(ok1==false) {
allesOK = false;
}

if(ok2==false) {
allesOK = false;
}

if(ok3==false) {
allesOK = false;
}

if(allesOK) {
qDebug() << "Alles OK";
} else {
qDebug() << "Fehler";
//Dann könntest du hier noch prüfen welche nicht ok waren
}
oder Variante 2

Code: Alles auswählen

if(ok1) {
   if(ok2) {
      if(ok3) {
         qDebug() << "alles OK";
      } else {
         qDebug() << "Feld 3 falsch";
      }
   else {
      qDebug() << "Feld 2 falsch";
   }
else {
   qDebug() << "Feld 1 falsch";
}
Mir persönlich würde jetzt zum Beispiel die zweite Variante besser gefallen, aber das ist wohl geschmackssache.

gruß jerry42

Verfasst: 29. Oktober 2008 16:17
von nici
ja jetzt versteh ich was du meinst.
Also die Zweite Variante gefällt mir auch besser als die erste, ich werde es mal gleich ausprobieren. Danke.

lg

nici

Verfasst: 29. Oktober 2008 16:29
von nici
hmm, so überprüft er aber nicht richtig.
Wenn ich Feld1=d Feld2=5 Feld3=d eingeben, dann sagt er mir nur dass Feld 1 falsch ist. Das Feld3 falsch ist sagt er erst gar nicht.

lg

nici