QLCDNumber Wertübergabe an andere Funktion

Alles rund um die Programmierung mit Qt
Antworten
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

QLCDNumber Wertübergabe an andere Funktion

Beitrag von Funthomas »

:shock:

Hallo,

ich bin Newbie und kämpfe seit einigen Tagen mit einem C++ Projekt.
Ich muß eine Gui erstellen, über die eine bestimmte Funktion, wie z.B. y = A * sin(B*x), grafisch darzustellen ist. Ich habe schon ein gutes Beispiel gefunden und ich habe schon eine Ausgabe für eine einfache Sinusfunktion ( printSinus(); ... y = sin(x); ... wobei x von -5 bis +5 läuft) hinbekommen. Meine Frage ist nun folgende:
Die Werte A und B sollen sich über einen Schiebregler verstellen lassen und der entsprechende Wert wird in einem QLCDNumber Widget angezeigt. Nun möchte ich den dargestellten LCD Wert ( z.B. A => 8 ) an meine Sinusfunktion übergeben und anzeigen lassen. Meine Sinusfunktion müßte daher ungefähr so aussehen: y= irgendwas.a * sin( irgendwas.b * x);
Wie kriege ich diese Übergabe der Parameter an meine Sinusfunktion hin ???

Vielen Dank

Funthomas
Face down Ass up, that's the way we like to ... dance ;)
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

Beitrag von Lykurg »

Also:
1. Schieberegler nennt sich QSlider
2. In QSlider das Signal valueChanged ( int value ) verwenden.

Code: Alles auswählen

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(xyz(int)));

void [this]::xyz(int a=1) 
{
   lcd->display( a );
   uebergebeAnSinusfunktion( a ); // [...]
}
Ciao,
Lykurg
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

Beitrag von Funthomas »

:oops:

hmmm,
das versteh ich net ganz.
Kannst du mir dein Beispielcode mal erklären?? Ich versteh nicht recht den Sinn des "this" beim Slot und die Art der Methode "void[this]::xyz ....

wäre echt net

Greetz Funthomas
Face down Ass up, that's the way we like to ... dance ;)
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

Beitrag von Lykurg »

Hi,

also angenommen du hast die Klasse "Sinus" mit sinus.cpp und sinus.h, dann gibts ja irgendwo

Code: Alles auswählen

Sinus::Sinus()
{
   [...]
}
oder so ähnlich. und da rein schreibst du

Code: Alles auswählen

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderBewegt(int)));
, wobei "slider" der Name deines QSlider ist.

In sinus.h fügst du hinzu:

Code: Alles auswählen

private slots:
   void slot_sliderBewegt(int a=0);
und dann wieder in sinus.cpp:

Code: Alles auswählen

void Sinus::slot_sliderBewegt(int a) {
// So und hier kannst du machen was du willst, und in a ist der Wert des QSlider. Und das hier wird immer aufgerufen, wenn sich der Werd des Sliders ändert.

// a in LCD setzen (name z.b. lcdLabel)
lcdLabel->display( a ); 

// und dann mit a deine Berechnungen machen und so weiter und so fort
}
So und dann noch ein Wort zu this: this enthält in diesem Beispiel einfach "Sinus", also immer den Klassennamen, in dem es steht.

Falls noch nicht klar bitte nochmal fragen, und ich werd probieren mich klarer auszudrücken.

Lykurg
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

Beitrag von Funthomas »

Hi,

danke für die gute Erklärung.Grundlegend hab ich wohl verstanden, nur ein Prob noch, Ich arbeite im Designer und meine Änderungen nehme ich ja in der Datei mainwindow.ui.h vor.
Hier habe ich die Funktion :

Code: Alles auswählen

void form1::printSinus()
Um jetzt deinen connect(slider1, SIGNAL,......) Befehl muß ich doch einen neuen Slot im Designer definieren. Der Slot müßte demnach slot_sliderBewegt() heissen. Rückgabewert des Slot (bei den Einstellungen)wäre nicht void, sondern int , wenn ich mich nicht irre.
Nun wird ja eine neue Methode Namens slot_sliderBewegt angelegt.
Diese sollte jetzt in meiner Sinusfunktion eingebunden werde. Hier mal mein Code

Code: Alles auswählen

   
const  double pi = 4*atan(1);			//Konstante pi definieren
   valuePair v;
   int       i=0, z=0;
   int a;

   for ( double x=minX*pi; x<maxX*pi; x+=schrittX )  // Zaehlen der Werte
      z++;

   FunctionPlot* plotWindow = new FunctionPlot( z );
   plotWindow->resize( 500, 500 );
   for ( v.x=minX*pi; v.x<=maxX*pi; v.x+=schrittX ) {

      v.y = sin(a*v.x);  //      a soll der Wert des Sliders sein
                                         muss nun das lcdLabel->display( a ); 
                                         davor ?? 

      plotWindow->setValue( i, v );
      i++;
   }

   plotWindow->plotIt();

   plotWindow->show();

wie muss ich das jetzt im Desingner realisieren. Ich muss das ja in der ui.h nachtragen. Ist halt ein bissel schwierig, da ich nicht weiß was man alles in der ui.h angeben muss und was vom Designer alles selbst angelegt wird .
Vielen dank aber erstmal und hab etwas Geduld mit mir, bin noch neu auf dem Gebiet QT usw.. ;)


Funthomas
Face down Ass up, that's the way we like to ... dance ;)
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

Beitrag von Lykurg »

Hi,
Der Slot müßte demnach slot_sliderBewegt() heissen. Rückgabewert des Slot (bei den Einstellungen)wäre nicht void, sondern int , wenn ich mich nicht irre.
Nein. Also an den slot slot_sliderBewegt(int a) wird lediglich ein integer-parameter a mitübergeben. ob das nun

Code: Alles auswählen


int form1::slot_sliderBewegt(int a)
bool form1::slot_sliderBewegt(int a)
void form1::slot_sliderBewegt(int a)

oder so ist hängt ja nur davon ab, was du in dem return der Funktion stehen hast.

Wenn du jetzt den valueChanged(int) mit diesem slot verbindest ist a halt der Wer des sliders.
a soll der Wert des Sliders sein
muss nun das lcdLabel->display( a );
davor ??
Ich dachte, dass du den Wert des Sliders auf dem lcdlabel angezeigt haben möchtest.

Lykurg
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

Beitrag von Funthomas »

Hi....

Nein, der Wert des Sliders wird schon korrekt über die Funktion valueChanged() angezeigt. Ich möchte nun diesen angezeigten Wert im LCD-Display an meine Sinusfunktion übergeben. Über den Slider werden die Parameter für die Sinusfunktion definiert.
Die Übergabe müßte ja dort geschehen, wo ich im Code den Kommentar : "a soll der Wert des ....." geschrieben habe.
Am slider sieht man ja keine genauen Werte. Meine Werte werden ja nur im LCD Display dargestellt, und wenn ich nun meinen Button "Berechne" drücke soll meine Sinusfunktion mit dem aktuell eingestellten Slider- bzw. im LCD-Display angezeigten Wert berechnet werden. Die Sinusfunktion wird ja durch die Variable A dann ja größer bzw. breiter.
So, ich hoffe, ich hab mein Prob nun gut beschrieben. wenn de willst kann ich dir mein Projekt ja mal per Mail schicken ???

Funthomas
Face down Ass up, that's the way we like to ... dance ;)
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

Beitrag von Funthomas »

ahhh, hab was gefunden.
Den LCD-Displaywert kann man mit der Funktion

Code: Alles auswählen

 int value() 
auslesen. Den Int-Wert müßte ich dann in meine Sinusfunktion einbinden können. Haste ein Tip wie man das am geschicktesten lösen kann, wie ich nun diesen int in meine

Code: Alles auswählen

void::printSinus() 
einbinden kann ??

Funthomas
Face down Ass up, that's the way we like to ... dance ;)
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

Du kannst doch Deine print-Funktion um die entsprechenden Parameter erweitern.

printSinus(int a, int b);

Und dann rufst Du in einem Slot, welches eh die Anzeige des LCDs übernimmt einfach noch printSinus mit den Parametern auf.

Gruß

Mike
Funthomas
Beiträge: 11
Registriert: 2. September 2004 20:09

Beitrag von Funthomas »

Hey hey hey......

ich hab das hinbekommen mit den Slidern !!!!!! ;)
Die Lösung war einfach die Umwandlung der Funktion sliderX->value() in ein QVariant Objekt.

Hier der Code :

Code: Alles auswählen



	int zA = slider1->value();             //Parameterübergabe der Slider in eine Variable
	QVariant vA(zA);
    
			
	const  double pi = 4*atan(1);			//Konstante pi definieren
	valuePair v;
	int       i=0, z=0;
	
	for ( double x=minX*pi; x<maxX*pi; x+=schrittX )  // Zaehlen der Werte
	    z++;
	
	FunctionPlot* plotWindow = new FunctionPlot( z );
	plotWindow->resize( 500, 500 );
	for ( v.x=minX*pi; v.x<=maxX*pi; v.x+=schrittX ) {
	    v.y = sin(zA*v.x);
	    plotWindow->setValue( i, v );
	    i++;
	}
	
	plotWindow->plotIt();
	
	plotWindow->show();

so, meine nächstes Problem ist, dass wenn ich mein Button "Berechne" drücke, immer eine neue Sinusfunktion gezeichnet wird. Also wenn ich x-mal die Werte verändere und den Berechne Button drücke, dann erscheinen auch X-verschiedene Sinusfuntionsfenster. Wie mach ich das, dass er das alte Fenster immer erst schliesst bevor er ein neues aufmacht ???

THX noch ma an Lykrug und miketech

Funthomas ;)
Face down Ass up, that's the way we like to ... dance ;)
Antworten