Hilfe bei kleiner Gui



  • 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

    struct XYvalue{
      double x;
      double y;
      XYvalue(double x, double y):x(x),y(y){}  
    };
    
    class MyWidget :public QWidget
    {
    
     Q_OBJECT;
    public:
    
     MyWidget(int n, QWidget *p=NULL,Qt::WindowFlags f=0);
    
    public slots:
      void plotten(void);
    
    private:
      QPushButton *plot;
      QLineEdit* xmin ;
      QLineEdit* xmax;
    
      void drawXScale(QPainter *p, double i, int yp);
      void drawYScale(QPainter *p, double i, int xp);
      int valueNo;
      std::vector<XYvalue> values;  
      double minX, minY,maxX, maxY, xFactor, yFactor;
      QColor farbe;
    
     protected:
     virtual void paintEvent( QPaintEvent *ev);
    
    };
    

    project.cpp

    MyWidget::MyWidget( int n, QWidget *p, Qt::WindowFlags f )
                   : QWidget( p, f ) {
    
      xmin = new QLineEdit(this);  
      xmin->setText( "0" );
      xmax= new QLineEdit(this);  
      xmax->setText( "0" );
    
      QPushButton *plot = new QPushButton("Plot",this); 
    
      QLabel *xminlab = new QLabel("xmin",this); // label
      QLabel *xmaxlab = new QLabel("xmax",this);
      QVBoxLayout* vlayout = new QVBoxLayout(this);  /
    
      vlayout->addWidget(xminlab);
      vlayout->addWidget(xmin);
      vlayout->addWidget(xmaxlab);
      vlayout->addWidget(xmax);
      vlayout->addWidget(plot);
    
    QObject::connect(plot,SIGNAL(clicked()),this,SLOT(plotten()));
    
     valueNo = n;
       int i;
       for (i=0; i<n; i++ ){
       values.push_back( XYvalue(0,0));
       }
    
     }
    
    void MyWidget::plotten() { 
      double X=0;
      double Y=0;
    
     double tmin = (xmin->text()).toDouble();
     double tmax = (xmax->text()).toDouble();
    
     double xr=(double)(tmax-tmin)/psize;
    
     X=tmin;
      for(int i=0; i<psize; i++){
      Y=sin(2*3.14*X);
      values.push_back(XYvalue(X,Y));
       X+=xr;
    
    }
    
    void MyWidget::paintEvent( QPaintEvent * ) {
    
       QPainter p( this );
       double  xp, yp, xpAlt, ypAlt, diffX, diffY, i;
       minX = maxX = values[0].x;
       minY = maxY = values[0].y;
    
      for ( int i=1; i<valueNo; i++ ) {
             if ( values[i].x < minX ) minX = values[i].x;
             if ( values[i].x > maxX ) maxX = values[i].x;
             if ( values[i].y < minY ) minY = values[i].y;
             if ( values[i].y > maxY ) maxY = values[i].y;
          }
    
       xFactor = width() / (maxX -minX),
       yFactor = height() / (maxY  -minY);
       xpAlt = xp = ( values[0].x - minX ) * xFactor;
        ypAlt = yp = ( maxY - values[0].y ) * yFactor;
    
      for ( i=1; i<valueNo; i++ ) {
         xp = ( values[(int)i].x - minX ) * xFactor;
          yp = ( maxY - values[(int)i].y ) * yFactor;
    
           p.drawLine( int(xpAlt), int(ypAlt), int(xp), int(yp) );
    
          xpAlt = xp;
          ypAlt = yp;
       }
    

    main.cpp

    int main(int argc,char** argv)
    {
      QApplication app(argc,argv);
      QWidget* mywidget = new MyWidget(psize);
      mywidget->resize(200,300);
      mywidget->show();
     return app.exec();
    }
    

    ich bin für jede Tipps sehr dankbar.

    Viele Grüße



  • Dem plotten() fehlt am Schluss noch ein update() .

    Der Plot wird allerdings als "Hintergrund" gemalt.
    Wenn du das in einem eigenen Bereich haben willst, musst den Inhalt der paintEvent() -Methode noch in ein separates QWidget verschieben.



  • genau das was ich eingentlich will, aber ich weis nicht, wie ich den Inhalt der paintEvent()-Methode noch in ein separates QWidget schreibe



  • Du musst dein 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.



  • ich habe mein Programm geändert und es lauft jetzt aber habe ein Problem nur ein Qwidget habe.in der Fenster ,in der ich die Parameter eingebe, wird auch die Funktion geplottet

    ich habe nur project.cpp geändert:
    project.cpp

    MyWidget::MyWidget( int n, QWidget *p, Qt::WindowFlags f )
           : QWidget( p, f ) {
    
      xmin = new QLineEdit(this);  // Text-Feld
      xmin->setText( "0" );
      xmax= new QLineEdit(this);  // Text-Feld
      xmax->setText( "0" );
    
      QPushButton *plot = new QPushButton("Plot",this); // Knopf
    
      QLabel *xminlab = new QLabel("xmin",this); // label
      QLabel *xmaxlab = new QLabel("xmax",this);
      QVBoxLayout* vlayout = new QVBoxLayout(this);  
    
      vlayout->addWidget(xminlab);
      vlayout->addWidget(xmin);
      vlayout->addWidget(xmaxlab);
      vlayout->addWidget(xmax);
      vlayout->addWidget(plot);
    
      valueNo = n;
       int i;
       for (i=0; i<n; i++ ){
       values.push_back( XYvalue(0,0));
       }
      QObject::connect(plot,SIGNAL(clicked()),this,SLOT(plotten()));
    
     }
    
    void MyWidget::plotten() { 
      double X=0;
      double Y=0;
    
      double tmin = (xmin->text()).toDouble();
      double tmax = (xmax->text()).toDouble();
    
     double xr=(double)(tmax-tmin)/psize;
     values.clear();
     X=tmin;
      for(int i=0; i<psize; i++){
      Y=sin(2*3.14*X);
      values.push_back(XYvalue(X,Y));
       X+=xr;
      }
      update();
    }
    void MyWidget::paintEvent( QPaintEvent * ) {
    
       QPainter p( this );
       double  xp, yp, xpAlt, ypAlt, diffX, diffY, i;
       minX = maxX = values[0].x;
       minY = maxY = values[0].y;
    
      for ( int i=1; i<valueNo; i++ ) {
             if ( values[i].x < minX ) minX = values[i].x;
             if ( values[i].x > maxX ) maxX = values[i].x;
             if ( values[i].y < minY ) minY = values[i].y;
             if ( values[i].y > maxY ) maxY = values[i].y;
          }
     if(qAbs(maxX - minX) > 0.0001 && qAbs(maxY - minY) > 0.0001) {
    
       xFactor = width() / (maxX -minX),
       yFactor = height() / (maxY -minY);
       // cout << xFactor<<'\t'<< yFactor<<'\n';
       p.setPen( Qt::red) ;
       //p.setBackgroundColor(Qt::white);    // yellow ); //new.... x- und y-Achsen zeichnen
       xp = -minX * xFactor;
       yp = maxY * yFactor;
       p.drawLine( 0, int(yp), width(), int(yp) );  // x-Achse
       p.drawLine( int(xp), 0, int(xp), height() ); // y-Achse
    
       diffX = (maxX-minX) / 10;        //.... x-Skalen zeichnen/beschriften
       for ( i = -diffX; i>=minX; i-=diffX )
          drawXScale( &p, i, int(yp) );
       for ( i = diffX; i<=maxX; i+=diffX )
          drawXScale( &p, i, int(yp) );
    
       diffY = (maxY-minY) / 10;        //.... y-Skalen zeichnen/beschriften
       for ( i = -diffY; i>=minY; i-=diffY )
          drawYScale( &p, i, int(xp) );
       for ( i = diffY; i<=maxY; i+=diffY )
          drawYScale( &p, i, int(xp) );
                                       //.... Funktion zeichnen
        xpAlt = xp = ( values[0].x - minX ) * xFactor;
        ypAlt = yp = ( maxY - values[0].y ) * yFactor;
        // cout << xp<<'\t'<< yp<<'\n';
        // cout <<minX<<'\t'<<maxY<<'\n';
       p.setPen( Qt::black);
    
       for ( i=1; i<valueNo; i++ ) {
         xp = ( values[(int)i].x - minX ) * xFactor;
          yp = ( maxY - values[(int)i].y ) * yFactor;
         // xp = ( values[(int)i].x ) * xFactor;
         // yp = ( values[(int)i].y ) * yFactor;
    
          // cout <<values[(int)i].x<< '\t' <<values[(int)i].y<<'\n';
    
           p.drawLine( int(xpAlt), int(ypAlt), int(xp), int(yp));
    
          xpAlt = xp;
          ypAlt = yp;
       }
       }
    }
    

    Kann mir Jemand sagen, wie ich mein MyWidget in 2 separate QWidget aufteilen kann.( Eine für die Eingabe und die zweite für den Plot mit dem paintEvent())

    Danke im Voraus.

    Du musst dein MyWidget in 2 separate QWidget aufteilen.


Anmelden zum Antworten