Seite 1 von 1
QLCDNumber Wertübergabe an andere Funktion
Verfasst: 2. September 2004 20:12
von Funthomas
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
Verfasst: 3. September 2004 14:04
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
Verfasst: 3. September 2004 15:31
von Funthomas
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
Verfasst: 3. September 2004 16:21
von Lykurg
Hi,
also angenommen du hast die Klasse "Sinus" mit sinus.cpp und sinus.h, dann gibts ja irgendwo
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:
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
Verfasst: 3. September 2004 17:16
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 :
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
Verfasst: 3. September 2004 17:58
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
Verfasst: 3. September 2004 22:33
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
Verfasst: 4. September 2004 14:10
von Funthomas
ahhh, hab was gefunden.
Den LCD-Displaywert kann man mit der Funktion
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
einbinden kann ??
Funthomas
Verfasst: 4. September 2004 15:00
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
Verfasst: 4. September 2004 16:16
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
