von
Qt-anfanger (Gast)
29.08.2011 15:28
Hallo zusammen,
ich bin Neulinge in Qt-Programmierung und muss aber ein kleines Programm
schreiben. das Programm soll einfach eine Sinuswerte plotten, die man
ihre Interval (xmin,xmax) über eine Gui eingeben soll;
zuerst habe das Programm geschreiben,wobei ich die parameter über die
Konsole gegeben habe und hat super funktioniert nun versuche ich es so
zu ändern dass ich die Prameter
über Gui eingeben kann, aber leider kriege ich es nicht zum laufen zwar
bekomme ich
keine Fehlermeldung aber bei Ausführung erhalte ich eine kleine graue
Fenster.
hier Abschnitte von meines Codes:
project.h 1 struct XYvalue {
2 double x ;
3 double y ;
4 XYvalue ( double x , double y ) : x ( x ), y ( y ){}
5 };
6
7 class MyWidget : public QWidget
8 {
9
10
11 Q_OBJECT ;
12 public:
13
14 MyWidget ( int n , QWidget * p = NULL , Qt :: WindowFlags f = 0 );
15
16 public slots :
17 void plotten ( void );
18
19 private:
20 QPushButton * plot ;
21 QLineEdit * xmin ;
22 QLineEdit * xmax ;
23
24 void drawXScale ( QPainter * p , double i , int yp );
25 void drawYScale ( QPainter * p , double i , int xp );
26 int valueNo ;
27 std :: vector < XYvalue > values ;
28 double minX , minY , maxX , maxY , xFactor , yFactor ;
29 QColor farbe ;
30
31
32 protected:
33 virtual void paintEvent ( QPaintEvent * ev );
34
35 };
project.cpp 1 MyWidget :: MyWidget ( int n , QWidget * p , Qt :: WindowFlags f )
2 : QWidget ( p , f ) {
3
4 xmin = new QLineEdit ( this );
5 xmin -> setText ( "0" );
6 xmax = new QLineEdit ( this );
7 xmax -> setText ( "0" );
8
9 QPushButton * plot = new QPushButton ( "Plot" , this );
10
11 QLabel * xminlab = new QLabel ( "xmin" , this ); // label
12 QLabel * xmaxlab = new QLabel ( "xmax" , this );
13 QVBoxLayout * vlayout = new QVBoxLayout ( this ); /
14
15 vlayout -> addWidget ( xminlab );
16 vlayout -> addWidget ( xmin );
17 vlayout -> addWidget ( xmaxlab );
18 vlayout -> addWidget ( xmax );
19 vlayout -> addWidget ( plot );
20
21 QObject :: connect ( plot , SIGNAL ( clicked ()), this , SLOT ( plotten ()));
22
23 valueNo = n ;
24 int i ;
25 for ( i = 0 ; i < n ; i ++ ){
26 values . push_back ( XYvalue ( 0 , 0 ));
27 }
28
29
30 }
31
32 void MyWidget :: plotten () {
33 double X = 0 ;
34 double Y = 0 ;
35
36 double tmin = ( xmin -> text ()). toDouble ();
37 double tmax = ( xmax -> text ()). toDouble ();
38
39 double xr = ( double )( tmax - tmin ) / psize ;
40
41 X = tmin ;
42 for ( int i = 0 ; i < psize ; i ++ ){
43 Y = sin ( 2 * 3 . 14 * X );
44 values . push_back ( XYvalue ( X , Y ));
45 X += xr ;
46
47 }
48
49 void MyWidget :: paintEvent ( QPaintEvent * ) {
50
51 QPainter p ( this );
52 double xp , yp , xpAlt , ypAlt , diffX , diffY , i ;
53 minX = maxX = values [ 0 ]. x ;
54 minY = maxY = values [ 0 ]. y ;
55
56 for ( int i = 1 ; i < valueNo ; i ++ ) {
57 if ( values [ i ]. x < minX ) minX = values [ i ]. x ;
58 if ( values [ i ]. x > maxX ) maxX = values [ i ]. x ;
59 if ( values [ i ]. y < minY ) minY = values [ i ]. y ;
60 if ( values [ i ]. y > maxY ) maxY = values [ i ]. y ;
61 }
62
63 xFactor = width () / ( maxX - minX ),
64 yFactor = height () / ( maxY - minY );
65 xpAlt = xp = ( values [ 0 ]. x - minX ) * xFactor ;
66 ypAlt = yp = ( maxY - values [ 0 ]. y ) * yFactor ;
67
68 for ( i = 1 ; i < valueNo ; i ++ ) {
69 xp = ( values [( int ) i ]. x - minX ) * xFactor ;
70 yp = ( maxY - values [( int ) i ]. y ) * yFactor ;
71
72 p . drawLine ( int ( xpAlt ), int ( ypAlt ), int ( xp ), int ( yp ) );
73
74 xpAlt = xp ;
75 ypAlt = yp ;
76 }
main.cpp 1 int main ( int argc , char ** argv )
2 {
3 QApplication app ( argc , argv );
4 QWidget * mywidget = new MyWidget ( psize );
5 mywidget -> resize ( 200 , 300 );
6 mywidget -> show ();
7 return app . exec ();
8 }
ich bin für jede Tipps sehr dankbar.
Viele Grüße
von
hp-freund (Gast)
29.08.2011 20:00
Ich denke es wäre besser wenn Du das komplette Projekt in eine zip Datei
packst. Dann kann man es besser testen...
von
C++anfänger (Gast)
29.08.2011 22:16
hp-freund schrieb:
> Ich denke es wäre besser wenn Du das komplette Projekt in eine zip Datei
> packst. Dann kann man es besser testen...
Hallo hp-freund!
der Rest spielt eigentlich keine größe Rolle. die Funktionen die da
nicht implementiert sind kann man auskomentiern
von
hp-freund (Gast)
29.08.2011 22:31
Wir wollen helfen einen Fehler zu finden, aber das Projekt noch mal neu
erfinden? Nöö.
von
C++anfänger (Gast)
29.08.2011 22:42
ich kann dir es gerne schicken, mache ich gleich
von
C++anfänger (Gast)
29.08.2011 22:54
hier ist das project im anhang
von
C++anfänger (Gast)
29.08.2011 22:58
ich versuche zwei sprate Widgets hinzukrigen. eine soll einfach die für
die Eingabe und die zweite sollte den Inhalt paintEvent()-Methode (das
plotten) barstellen
Danke schonmal im voraus
von
hp-freund (Gast)
29.08.2011 23:00
Ok. Das graue Fenster hab ich jetzt auch.
Ich versuche es mal ...
von
Qt-anfänger (Gast)
29.08.2011 23:03
ich versuche zwei sprate Widgets hinzukrigen. eine soll einfach die für
die Eingabe und die zweite sollte den Inhalt paintEvent()-Methode (das
plotten) barstellen
Danke schonmal im voraus
Dann versuch doch erstmal in deinem paintEvent ein rotes Rechteck von
10/10 nach 100/100 zum mahlen.
Noch zwei Anmerkungen:
1) Warum ne eigene Struct für einen Punkt? Was stimmt mit QPoint und
QPointF nicht?
2) Wenn du gleich QPolygonF anstatt dem std::vector nimmst, kannst du
dir die Schleife zum Malen der Linie sparen (QPainter::drawPolyline)
von
Qt-anfänger (Gast)
29.08.2011 23:14
hab es extra globale definiert wie ich die punkte in anderen classen
verwenden möchte
QPointF kannst du im ganzen Projekt und darüber hinaus benutzen.
von
Qt-anfänger (Gast)
29.08.2011 23:18
Axel Jäger schrieb:
> Dann versuch doch erstmal in deinem paintEvent ein rotes Rechteck von
> 10/10 nach 100/100 zum mahlen.
>
> Noch zwei Anmerkungen:
>
> 1) Warum ne eigene Struct für einen Punkt? Was stimmt mit QPoint und
> QPointF nicht?
> 2) Wenn du gleich QPolygonF anstatt dem std::vector nimmst, kannst du
> dir die Schleife zum Malen der Linie sparen (QPainter::drawPolyline)
danke Axel für deine tipps
das muss ich noch anschauen, wie gesagt ich ein Neulinge in Qt
von
hp-freund (Gast)
30.08.2011 00:07
Hab leider noch nichts.
Jetzt muss ich erst mal schlafen ....
von
Qt-anfänger (Gast)
30.08.2011 00:14
Danke sehr und gute nacht
von
ich (Gast)
30.08.2011 03:27
Hallo,
1. ersetze QLineEdit mit QDoubleSpinBox 1 xmin = new QDoubleSpinBox ( this ); // Text-Feld
2 xmin -> setMinimum ( - 99 . 9 );
3 xmin -> setValue ( 0 . 0 );
4 xmax = new QDoubleSpinBox ( this ); // Text-Feld
5 xmax -> setValue ( 0 . 0 );
6
7 ...
8
9 double tmin = xmin -> value ();
10 double tmax = xmax -> value ();
2. Korrekte Nutzung von std::vector (Alternativ Vorschlag von
axeljaeger) 1 //entweder vor dem hinzufügen neuer Werte, zuerst die alten löschen
2 values . clear ();
3
4 X = tmin ;
5 for ( int i = 0 ; i < psize ; i ++ ){
6 Y = sin ( 2 * 3 . 14 * X );
7 values . push_back ( XYvalue ( X , Y ));
8 X += xr ;
9
10 }
11
12 //oder values mit fester Groesse initialisieren
13 MyWidget :: MyWidget ( int n , QWidget * p , Qt :: WindowFlags f )
14 : QWidget ( p , f ), values ( n ) //<--
15
16 // benoetigt zum initialisieren der einzelnen Elemente den Konstruktor:
17 XYvalue () : x ( 0 . 0 ), y ( 0 . 0 ){}
18
19 //Zugriff erfolgt dann direkt auf Elemente, ohne push_back
20 for ( unsigned int i = 0 ; i < values . size (); i ++ ){
21 Y = sin ( 2 * 3 . 14 * X );
22 values [ i ] = XYvalue ( X , Y );
23 X += xr ;
24 }
3. Abfangen von Endlosschleifen 1 void MyWidget :: paintEvent ( QPaintEvent * ) {
2
3 QPainter p ( this );
4 double xp , yp , xpAlt , ypAlt , diffX , diffY , i ;
5 minX = maxX = values [ 0 ]. x ;
6 minY = maxY = values [ 0 ]. y ;
7
8 for ( int i = 1 ; i < valueNo ; i ++ ) {
9 if ( values [ i ]. x < minX ) minX = values [ i ]. x ;
10 if ( values [ i ]. x > maxX ) maxX = values [ i ]. x ;
11 if ( values [ i ]. y < minY ) minY = values [ i ]. y ;
12 if ( values [ i ]. y > maxY ) maxY = values [ i ]. y ;
13 }
14
15 //pruefen auf unzulaessige Werte
16 if ( qAbs ( maxX - minX ) > 0 . 0001 && qAbs ( maxY - minY ) > 0 . 0001 ) {
17
18 ...
19
20 }
21 }
Damit sollte das Programm zumindest einigermaßen zuverlässig laufen und
so in etwa die gewünschte Funktion erfüllen.
von
Qt-anfanger (Gast)
31.08.2011 01:11
das habe ich versucht hat aber leider nicht was gebracht bekomme
immer noch nur die graue Fenster
von
Qt-anfanger (Gast)
31.08.2011 01:20
ja es lauft aber statt dass ich zwei Widgets bokomme,bokomme ich
jetzt nur eine Widget.
ich möchte MyWidget in 2 separate QWidget aufteilen. Eines davon z.B.
PlotWidget, macht nur den Plot mit dem paintEvent().
Das Andere den Rest mit zusätlich eingebundenem PlotWidget.
Wie gesagt, Schritt für Schritt vorgehen, erstmal eine Linie malen mit
Konstanten und definierter Farbe und dann von da weiter hangeln. Im
Moment wird blind rumprogrammiert und keiner weis, wo der Fehler liegt.
von
Qt-anfanger (Gast)
31.08.2011 14:19
wie man im Bild im Anhang sieht, sind die beiden Widget in gleichen
Fenster. mein problem ist wie kann ich MyWidget in 2 separaten QWidget
aufteilen kann.
so sieht jetzt Axel mein kleines Prorgamm :
project.h 1 struct XYvalue {
2 double x ;
3 double y ;
4 XYvalue ( double x , double y ) : x ( x ), y ( y ){} // Konstruktor
5 };
6
7 class MyWidget : public QWidget
8 {
9
10 Q_OBJECT
11 public:
12
13 MyWidget ( int n , QWidget * p = NULL , Qt :: WindowFlags f = 0 );
14
15 public slots :
16 void plotten ( void );
17
18 private:
19 QPushButton * plot ;
20 QLineEdit * xmin ;
21 QLineEdit * xmax ;
22 int valueNo ;
23 std :: vector < XYvalue > values ;
24 double minX , minY , maxX , maxY , xFactor , yFactor ;
25 QColor farbe ;
26 protected:
27
28 virtual void paintEvent ( QPaintEvent * ev );
29
30 };
31
32 #endif
project.cpp: 1 MyWidget :: MyWidget ( int n , QWidget * p , Qt :: WindowFlags f )
2 : QWidget ( p , f ) {
3
4 xmin = new QLineEdit ( this );
5 xmin -> setText ( "0" );
6 xmax = new QLineEdit ( this );
7 xmax -> setText ( "0" );
8
9 QPushButton * plot = new QPushButton ( "Plot" , this ); // Knopf
10
11 QLabel * xminlab = new QLabel ( "xmin" , this ); // label
12 QLabel * xmaxlab = new QLabel ( "xmax" , this );
13 QVBoxLayout * vlayout = new QVBoxLayout ( this );
14
15 vlayout -> addWidget ( xminlab );
16 vlayout -> addWidget ( xmin );
17 vlayout -> addWidget ( xmaxlab );
18 vlayout -> addWidget ( xmax );
19 vlayout -> addWidget ( plot );
20
21
22 valueNo = n ;
23 int i ;
24 for ( i = 0 ; i < n ; i ++ ){
25 values . push_back ( XYvalue ( 0 , 0 ));
26 }
27 QObject :: connect ( plot , SIGNAL ( clicked ()), this , SLOT ( plotten ()));
28
29 }
30
31
32 void MyWidget :: plotten () {
33 double X = 0 ;
34 double Y = 0 ;
35
36 double tmin = ( xmin -> text ()). toDouble ();
37 double tmax = ( xmax -> text ()). toDouble ();
38
39 double xr = ( double )( tmax - tmin ) / psize ;
40 values . clear ();
41 X = tmin ;
42 for ( int i = 0 ; i < psize ; i ++ ){
43 Y = sin ( X );
44 values . push_back ( XYvalue ( X , Y ));
45 X += xr ;
46 }
47 update ();
48 }
49 void MyWidget :: paintEvent ( QPaintEvent * ) {
50
51 QPainter p ( this );
52 double xp , yp , xpAlt , ypAlt , diffX , diffY , i ;
53 minX = maxX = values [ 0 ]. x ;
54 minY = maxY = values [ 0 ]. y ;
55
56 for ( int i = 1 ; i < valueNo ; i ++ ) {
57 if ( values [ i ]. x < minX ) minX = values [ i ]. x ;
58 if ( values [ i ]. x > maxX ) maxX = values [ i ]. x ;
59 if ( values [ i ]. y < minY ) minY = values [ i ]. y ;
60 if ( values [ i ]. y > maxY ) maxY = values [ i ]. y ;
61 }
62 if ( qAbs ( maxX - minX ) > 0 . 0001 && qAbs ( maxY - minY ) > 0 . 0001 ) {
63 xFactor = width () / ( maxX - minX ),
64 yFactor = height () / ( maxY - minY );
65 p . setPen ( Qt :: red ) ;
66 xp = - minX * xFactor ;
67 yp = maxY * yFactor ;
68 p . drawLine ( 0 , int ( yp ), width (), int ( yp ) );
69 p . drawLine ( int ( xp ), 0 , int ( xp ), height () );
70
71 xpAlt = xp = ( values [ 0 ]. x - minX ) * xFactor ;
72 ypAlt = yp = ( maxY - values [ 0 ]. y ) * yFactor ;
73 p . setPen ( Qt :: black );
74
75 for ( i = 1 ; i < valueNo ; i ++ ) {
76 xp = ( values [( int ) i ]. x - minX ) * xFactor ;
77 yp = ( maxY - values [( int ) i ]. y ) * yFactor ;
78
79 p . drawLine ( int ( xpAlt ), int ( ypAlt ), int ( xp ), int ( yp ) );
80
81 xpAlt = xp ;
82 ypAlt = yp ;
83 }
main.cpp: 1 int main ( int argc , char ** argv )
2 {
3 QApplication app ( argc , argv );
4 QWidget * mywidget = new MyWidget ( psize );
5 mywidget -> resize ( 200 , 300 );
6 mywidget -> show ();
7 return app . exec ();
8 }
bin für jede Tipps sehr Dankbar.
Indem du nicht das gleiche Widget zum Malen und als Container für den
Rest nimmst, sondern zwei Klassen machst.
von
Qt-anfanger (Gast)
31.08.2011 14:39
ok danke ich versuch mal das in zwei klassen zuteilen
von
Qt-anfanger (Gast)
31.08.2011 15:58
ich habe was versucht aber ich kriege es einfach nicht zum laufen habe
jetzt folgende Probleme:
ersetmal wo soll ich die beiden Objecte verbinden in main wie ich
versucht habe oder soll ich Object für Container in painte Widget
aufrufen und die Paramater konnte ich nicht rauslesen
hier was ich versucht habe:
project.h 1 struct XYvalue {
2 double x ;
3 double y ;
4 XYvalue ( double x , double y ) : x ( x ), y ( y ){} // Konstruktor
5 };
6
7 class MyWidget : public QWidget
8 {
9
10
11 Q_OBJECT
12 public:
13 MyWidget ( void );
14 double get_xmin (); // liefert xmin zurueck
15 double get_xmax (); //liefer xmax zurueck
16
17 private:
18 QPushButton * plot ;
19 QLineEdit * xmin ;
20 QLineEdit * xmax ;
21 };
22
23 class FUNCPLOT : public QWidget
24 {
25
26 Q_OBJECT
27
28 public:
29
30 FUNCPLOT ( int n , QWidget * p = NULL , Qt :: WindowFlags f = 0 );
31
32 public slots :
33 void plotten ( double xmin , double xmax );
34
35 private:
36 int valueNo ;
37 std :: vector < XYvalue > values ;
38 double minX , minY , maxX , maxY , xFactor , yFactor ;
39 QColor farbe ;
40
41 protected:
42
43 virtual void paintEvent ( QPaintEvent * ev );
44
45 };
46
47 #endif
project.cpp 1 MyWidget :: MyWidget ( void ){
2
3 xmin = new QLineEdit ( this );
4 xmin -> setText ( "0" );
5 xmax = new QLineEdit ( this );
6 xmax -> setText ( "0" );
7
8 QPushButton * plot = new QPushButton ( "Plot" , this );
9
10 QLabel * xminlab = new QLabel ( "xmin" , this ); // label
11 QLabel * xmaxlab = new QLabel ( "xmax" , this );
12 QVBoxLayout * vlayout = new QVBoxLayout ( this );
13
14 vlayout -> addWidget ( xminlab );
15 vlayout -> addWidget ( xmin );
16 vlayout -> addWidget ( xmaxlab );
17 vlayout -> addWidget ( xmax );
18 vlayout -> addWidget ( plot );
19 }
20
21 double MyWidget :: get_xmin (){
22
23 double tmin = ( xmin -> text ()). toDouble ();
24 return tmin ;
25 }
26
27 double MyWidget :: get_xmax (){
28
29 double tmax = ( xmax -> text ()). toDouble ();
30 return tmax ;
31 }
32
33 FUNCPLOT :: FUNCPLOT ( int n , QWidget * p , Qt :: WindowFlags f )
34 : QWidget ( p , f ) {
35
36 valueNo = n ;
37 int i ;
38 for ( i = 0 ; i < n ; i ++ ){
39 values . push_back ( XYvalue ( 0 , 0 ));
40 }
41
42 }
43
44
45 void FUNCPLOT :: plotten ( double tmin , double tmax ) {
46 double X = 0 ;
47 double Y = 0 ;
48
49 double xr = ( double )( tmax - tmin ) / psize ;
50 values . clear ();
51 X = tmin ;
52 for ( int i = 0 ; i < psize ; i ++ ){
53 // Y=sin(2*3.14*X);
54 Y = sin ( X );
55 values . push_back ( XYvalue ( X , Y ));
56 X += xr ;
57 }
58 update ();
59 }
60
61 void FUNCPLOT :: paintEvent ( QPaintEvent * ) {
62
63 QPainter p ( this );
64 double xp , yp , xpAlt , ypAlt , diffX , diffY , i ;
65 minX = maxX = values [ 0 ]. x ;
66 minY = maxY = values [ 0 ]. y ;
67
68 for ( int i = 1 ; i < valueNo ; i ++ ) {
69 if ( values [ i ]. x < minX ) minX = values [ i ]. x ;
70 if ( values [ i ]. x > maxX ) maxX = values [ i ]. x ;
71 if ( values [ i ]. y < minY ) minY = values [ i ]. y ;
72 if ( values [ i ]. y > maxY ) maxY = values [ i ]. y ;
73 }
74
75 if ( qAbs ( maxX - minX ) > 0 . 0001 && qAbs ( maxY - minY ) > 0 . 0001 ) {
76 xFactor = width () / ( maxX - minX ),
77 yFactor = height () / ( maxY - minY );
78 p . setPen ( Qt :: red ) ;
79 xp = - minX * xFactor ;
80 yp = maxY * yFactor ;
81 p . drawLine ( 0 , int ( yp ), width (), int ( yp ) );
82 p . drawLine ( int ( xp ), 0 , int ( xp ), height () );
83
84 xpAlt = xp = ( values [ 0 ]. x - minX ) * xFactor ;
85 ypAlt = yp = ( maxY - values [ 0 ]. y ) * yFactor ;
86 p . setPen ( Qt :: black );
87
88 for ( i = 1 ; i < valueNo ; i ++ ) {
89 xp = ( values [( int ) i ]. x - minX ) * xFactor ;
90 yp = ( maxY - values [( int ) i ]. y ) * yFactor ;
91
92 p . drawLine ( int ( xpAlt ), int ( ypAlt ), int ( xp ), int ( yp ) );
93
94 xpAlt = xp ;
95 ypAlt = yp ;
96 }
97 }
98 }
main.cpp 1 int main ( int argc , char ** argv )
2 {
3
4 double min , max ;
5
6 QApplication app ( argc , argv );
7 QWidget * mywidget = new MyWidget ();
8 mywidget -> resize ( 200 , 300 );
9 mywidget -> show ();
10
11 min = mywidget . get_xmin ();
12 max = mywidget . get_xmax ();
13
14 QWidget * funcplot = new FUNCPLOT ( psize );
15 funcplot . plotten ( min , max );
16
17 QObject :: connect ( mywidget . plot , SIGNAL ( clicked ()), this , SLOT ( funcplot . plotten ( min , max ))); //???
18 funcplot -> resize ( 200 , 300 );
19 funcplot -> show ();
20 return app . exec ();
21 }
von
hp-freund (Gast)
31.08.2011 17:06
Hallo,
ich hatte jetzt auch mal wieder Zeit mich mit dem Problem zu
beschäftigen.
Wenn Du Probleme mit den getrennten Widgets hast, sieh dir das mal an:
http://zetcode.com/tutorials/qt4tutorial/customwidget/
von
Qt-anfanger (Gast)
31.08.2011 18:03
Oh danke hp-freund. wie du siehst ich habe immer mein Problem noch
nicht glöst
von
ich (Gast)
31.08.2011 18:04
Wenn du es über Signal-Slot Verbindungen lösen möchtest, dann definiere
in MyWidget einen passendes Signal zu FUNCPLOT::plotten (du möchtest ja
Daten versenden).
Also: 1 class MyWidget : public QWidget
2 {...
3 signals:
4 void startPlot ( double tmin , double tmax ); // in main mit FUNCPLOT::plotten verbinden
5
6 private slots :
7 void buttonClicked (); // im Konstruktor wie gehabt mit button clicked verbinden
8 ...}
9
10 void MyWidget :: buttonClicked ()
11 {
12 // tmin, tmax einlesen
13 ...
14 emit startPlot ( tmin , tmax ); // Signal mit eingelesenen Werten absenden
15 }
Ansonsten solltest du mal deinen Code aufräumen (es wurden dir ja schon
einige Hinweise gegeben) und vor allem das #define psize entfernen.
von
Qt-anfanger (Gast)
31.08.2011 18:15
dnke für deine tipps werde ich gleich probieren
von
Qt-anfanger (Gast)
31.08.2011 18:22
ich schrieb:
> void MyWidget::buttonClicked()
> {
> // tmin, tmax einlesen
> ...
> emit startPlot(tmin, tmax); // Signal mit eingelesenen Werten absenden
> }
>
> Ansonsten solltest du mal deinen Code aufräumen (es wurden dir ja schon
> einige Hinweise gegeben) und vor allem das #define psize entfernen.
ich verstehe nicht was du bei dieser funktion buttonClicked() meinst
wie kann ich tmin und tmax darüber schicken
von
ich (Gast)
31.08.2011 18:42
MyWidget::buttonClicked() wird mit dem clicked() Signal deines Buttons
verbunden (so wie du am Anfang MyWidget::plotten() erstellt hattest).
In buttonClicked() werden dann deine beiden Eingabefelder ausgelesen und
die Werte mit "emit ..." verschickt. Dein Slot FUNCPLOT::plotten(double
tmin ,double tmax) empfängt dann diese Werte und kann damit arbeiten.
von
ich (Gast)
31.08.2011 19:12
Noch ein paar allgemeine Anmerkungen.
Wenn du schon solche Schleifen programmierst: 1 for ( i = - diffX ; i >= minX ; i -= diffX )
2 drawXScale ( & p , i , int ( yp ) );
dann solltest du auf jeden Fall vorher prüfen, dass die Schleife auch in
absehbarer Zeit beendet wird. Also z.B. das diffX >> 0 ist.
Deine typecasts sind alle vermeidbar und so etwas sollte man auf jeden
Fall vermeiden: 1 for ( i = 1 ; i < valueNo ; i ++ ) {
2 xp = ( values [( int ) i ]. x - minX ) * xFactor ;
3 yp = ( maxY - values [( int ) i ]. y ) * yFactor ;
von
Qt-anfanger (Gast)
31.08.2011 19:21
habe was du mir vorgschlagen hast probiert aber bekomme ich hier
kompeilefehler, die ich nich beseitigen konnte und weis nicht genau ob
ich gemacht was du meinst.
hier ist das Programm:
project.h 1 struct XYvalue {
2 double x ;
3 double y ;
4 XYvalue ( double x , double y ) : x ( x ), y ( y ){} // Konstruktor
5 };
6
7 class MyWidget : public QWidget
8 {
9 Q_OBJECT
10 public:
11 MyWidget ( void );
12
13
14 private:
15 QPushButton * plot ;
16 QLineEdit * xmin ;
17 QLineEdit * xmax ;
18
19 signals:
20
21 void startPlot ( double tmin , double tmax );
22
23 private slots :
24 void buttenClicked ();
25
26 };
27
28
29
30 class FUNCPLOT : public QWidget
31 {
32
33 Q_OBJECT
34
35 public:
36
37 FUNCPLOT ( int n , QWidget * p = NULL , Qt :: WindowFlags f = 0 );
38
39 public slots :
40 void plotten ( double xmin , double xmax );
41
42 private:
43 int valueNo ;
44 std :: vector < XYvalue > values ;
45 double minX , minY , maxX , maxY , xFactor , yFactor ;
46 QColor farbe ;
47
48
49 protected:
50
51 virtual void paintEvent ( QPaintEvent * ev );
52
53 };
54 #endif
project.cpp 1 MyWidget :: MyWidget ( void ){
2
3 xmin = new QLineEdit ( this );
4 xmin -> setText ( "0" );
5 xmax = new QLineEdit ( this );
6 xmax -> setText ( "0" );
7 QPushButton * plot = new QPushButton ( "Plot" , this ); // Knopf
8
9 QLabel * xminlab = new QLabel ( "xmin" , this ); // label
10 QLabel * xmaxlab = new QLabel ( "xmax" , this );
11 QVBoxLayout * vlayout = new QVBoxLayout ( this );
12
13 vlayout -> addWidget ( xminlab );
14 vlayout -> addWidget ( xmin );
15 vlayout -> addWidget ( xmaxlab );
16 vlayout -> addWidget ( xmax );
17 vlayout -> addWidget ( plot );
18
19 QObject :: connect ( plot , SIGNAL ( clicked ()), this , SLOT ( buttonClicked ()));
20 }
21
22 void MyWidget :: buttenClicked (){
23 double tmin = ( xmin -> text ()). toDouble ();
24 double tmax = ( xmax -> text ()). toDouble ();
25 emit startPlot ( tmin , tmax );
26 }
27
28
29 FUNCPLOT :: FUNCPLOT ( int n , QWidget * p , Qt :: WindowFlags f )
30 : QWidget ( p , f ) {
31
32 valueNo = n ;
33 int i ;
34 for ( i = 0 ; i < n ; i ++ ){
35 values . push_back ( XYvalue ( 0 , 0 ));
36 }
37
38 }
39
40
41 void FUNCPLOT :: plotten ( double tmin , double tmax ) {
42 double X = 0 ;
43 double Y = 0 ;
44
45 double xr = ( double )( tmax - tmin ) / psize ;
46 values . clear ();
47 X = tmin ;
48 for ( int i = 0 ; i < psize ; i ++ ){
49 Y = sin ( X );
50 values . push_back ( XYvalue ( X , Y ));
51 X += xr ;
52 }
53 update ();
54 }
55 void FUNCPLOT :: paintEvent ( QPaintEvent * ) {
56
57 QPainter p ( this );
58 double xp , yp , xpAlt , ypAlt , diffX , diffY , i ;
59 minX = maxX = values [ 0 ]. x ;
60 minY = maxY = values [ 0 ]. y ;
61
62 for ( int i = 1 ; i < valueNo ; i ++ ) {
63 if ( values [ i ]. x < minX ) minX = values [ i ]. x ;
64 if ( values [ i ]. x > maxX ) maxX = values [ i ]. x ;
65 if ( values [ i ]. y < minY ) minY = values [ i ]. y ;
66 if ( values [ i ]. y > maxY ) maxY = values [ i ]. y ;
67 }
68 if ( qAbs ( maxX - minX ) > 0 . 0001 && qAbs ( maxY - minY ) > 0 . 0001 ) {
69 xFactor = width () / ( maxX - minX ),
70 yFactor = height () / ( maxY - minY );
71 p . setPen ( Qt :: red ) ;
72 xp = - minX * xFactor ;
73 yp = maxY * yFactor ;
74 p . drawLine ( 0 , int ( yp ), width (), int ( yp ) );
75 p . drawLine ( int ( xp ), 0 , int ( xp ), height () );
76
77 xpAlt = xp = ( values [ 0 ]. x - minX ) * xFactor ;
78 ypAlt = yp = ( maxY - values [ 0 ]. y ) * yFactor ;
79 p . setPen ( Qt :: black );
80
81 for ( i = 1 ; i < valueNo ; i ++ ) {
82 xp = ( values [( int ) i ]. x - minX ) * xFactor ;
83 yp = ( maxY - values [( int ) i ]. y ) * yFactor ;
84
85 p . drawLine ( int ( xpAlt ), int ( ypAlt ), int ( xp ), int ( yp ) );
86
87 xpAlt = xp ;
88 ypAlt = yp ;
89 }
90 }
91 }
main.cpp 1 int main ( int argc , char ** argv )
2 {
3
4 QApplication app ( argc , argv );
5 QWidget * mywidget = new MyWidget (); //(psize);
6 mywidget -> resize ( 200 , 300 );
7 mywidget -> show ();
8
9 QWidget * funcplot = new FUNCPLOT ( psize );
10 funcplot . plotten ( min , max );
11
12 QObject :: connect ( mywidget . startPlot ( double tmin , double tmin ), SIGNAL ( clicked ()), this , SLOT ( funcplot . plotten ( min , max )));
13
14 funcplot -> resize ( 200 , 300 );
15 funcplot -> show ();
16 return app . exec ();
17 }
hier ist Compeilerfehler: 1 main . cpp : In function â int main ( int , char ** ) â :
2 main . cpp : 29 : 10 : error : request for member â plotten â in â funcplot â , which is of non - class type â QWidget * â
3 main . cpp : 31 : 28 : error : request for member â startPlot â in â mywidget â , which is of non - class type â QWidget * â
4 main . cpp : 31 : 38 : error : expected primary - expression before â double â
5 main . cpp : 31 : 51 : error : expected primary - expression before â double â
6 main . cpp : 31 : 82 : error :
von
ich (Gast)
31.08.2011 19:56
Ich verweise hier mal auf die Dokumentation zu connect:
http://doc.qt.nokia.com/4.7/qobject.html#connect
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.