Hilfe bei kleiner Gui

Gast #2324554
Lesenswert?

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
#2325203
Lesenswert?

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)
Gast #2325219
Lesenswert?

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
Gast #2325345
Lesenswert?

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.
Gast #2327202
Lesenswert?

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.
Angehängte Dateien:
Gast #2327346
Lesenswert?

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
}
Gast #2327560
Lesenswert?

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.
Gast #2327580
Lesenswert?

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
Gast #2327604
Lesenswert?

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.
Gast #2327639
Lesenswert?

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;
Gast #2327649
Lesenswert?

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:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren