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

Alles rund um die Programmierung mit Qt
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

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

Beitrag 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
Zuletzt geändert von nici am 31. Oktober 2008 10:50, insgesamt 1-mal geändert.
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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 ?
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag von nici »

ja danke das hilft mir weiter, ich probiers aus, wenn ich wieder eine ausführbare Datei habe ^^.

lg

nici
Hmm mir fällt nichts ein ^^
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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.
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Wenn du nochmal deinen aktuellen Code posten würdest, dann sieht man bestimmt wo der Fehler liegt.
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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]
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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
Hmm mir fällt nichts ein ^^
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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
Hmm mir fällt nichts ein ^^
nici
Beiträge: 246
Registriert: 29. Oktober 2008 12:50

Beitrag 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
Hmm mir fällt nichts ein ^^
Antworten