QLCDNumber Wertübergabe an andere Funktion
QLCDNumber Wertübergabe an andere Funktion
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
Also:
1. Schieberegler nennt sich QSlider
2. In QSlider das Signal valueChanged ( int value ) verwenden.
Ciao,
Lykurg
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 ); // [...]
}
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
, wobei "slider" der Name deines QSlider ist.
In sinus.h fügst du hinzu:
und dann wieder in sinus.cpp:
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
also angenommen du hast die Klasse "Sinus" mit sinus.cpp und sinus.h, dann gibts ja irgendwo
Code: Alles auswählen
Sinus::Sinus()
{
[...]
}
Code: Alles auswählen
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderBewegt(int)));
In sinus.h fügst du hinzu:
Code: Alles auswählen
private slots:
void slot_sliderBewegt(int a=0);
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
}
Falls noch nicht klar bitte nochmal fragen, und ich werd probieren mich klarer auszudrücken.
Lykurg
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
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
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()
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
Hi,
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.
Lykurg
Nein. Also an den slot slot_sliderBewegt(int a) wird lediglich ein integer-parameter a mitübergeben. ob das nunDer 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.
Code: Alles auswählen
int form1::slot_sliderBewegt(int a)
bool form1::slot_sliderBewegt(int a)
void form1::slot_sliderBewegt(int a)
Wenn du jetzt den valueChanged(int) mit diesem slot verbindest ist a halt der Wer des sliders.
Ich dachte, dass du den Wert des Sliders auf dem lcdlabel angezeigt haben möchtest.a soll der Wert des Sliders sein
muss nun das lcdLabel->display( a );
davor ??
Lykurg
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
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
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
Den LCD-Displaywert kann man mit der Funktion
Code: Alles auswählen
int value()
Code: Alles auswählen
void::printSinus()
Funthomas
Face down Ass up, that's the way we like to ... dance
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 :
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
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();
THX noch ma an Lykrug und miketech
Funthomas
Face down Ass up, that's the way we like to ... dance