Forum: PC-Programmierung Hilfe bei kleiner Gui


von Qt-anfanger (Gast)


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

von hp-freund (Gast)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

Wir wollen helfen einen Fehler zu finden, aber das Projekt noch mal neu 
erfinden? Nöö.

von C++anfänger (Gast)


Lesenswert?

ich kann dir es gerne schicken,  mache  ich gleich

von C++anfänger (Gast)


Angehängte Dateien:

Lesenswert?

hier ist das project im anhang

von C++anfänger (Gast)


Lesenswert?

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)


Lesenswert?

Ok. Das graue Fenster hab ich jetzt auch.
Ich versuche es mal ...

von Qt-anfänger (Gast)


Lesenswert?

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 Axel J. (axeljaeger)


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)

von Qt-anfänger (Gast)


Lesenswert?

hab es extra globale definiert wie ich die punkte in anderen classen 
verwenden möchte

von Axel J. (axeljaeger)


Lesenswert?

QPointF kannst du im ganzen Projekt und darüber hinaus benutzen.

von Qt-anfänger (Gast)


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

von hp-freund (Gast)


Lesenswert?

Hab leider noch nichts.
Jetzt muss ich erst mal schlafen ....

von Qt-anfänger (Gast)


Lesenswert?

Danke sehr  und gute nacht

von ich (Gast)


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.

von Qt-anfanger (Gast)


Lesenswert?

das habe ich  versucht  hat aber leider  nicht was gebracht  bekomme 
immer  noch nur die graue Fenster

von Qt-anfanger (Gast)


Lesenswert?

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.

von Axel J. (axeljaeger)


Lesenswert?

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)


Angehängte Dateien:

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.

von Axel J. (axeljaeger)


Lesenswert?

Indem du nicht das gleiche Widget zum Malen und als Container für den 
Rest nimmst, sondern zwei Klassen machst.

von Qt-anfanger (Gast)


Lesenswert?

ok danke ich versuch mal das in zwei klassen zuteilen

von Qt-anfanger (Gast)


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
}

von hp-freund (Gast)


Lesenswert?

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)


Lesenswert?

Oh danke hp-freund. wie du siehst  ich habe immer  mein Problem noch 
nicht glöst

von ich (Gast)


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.

von Qt-anfanger (Gast)


Lesenswert?

dnke für deine tipps werde ich gleich probieren

von Qt-anfanger (Gast)


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

von ich (Gast)


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.

von ich (Gast)


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;

von Qt-anfanger (Gast)


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:

von ich (Gast)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.