ein Widget in zwei separate QWidget aufteilen



  • Hallo Zusammen!

    ich hänge in diesem Problem seit gestern und zwar wie kann ich MyWidget in 2 separaten QWidget aufteilen kann.jetzt sind die Eingabe und die Zeichnung von der Funktion in der gleichen Fenster und versuche die ganze Zeit sie in zwei separate Fenster zukriegen.

    project.h

    struct XYvalue{
      double x;
      double y;
      XYvalue(double x, double y):x(x),y(y){}  //  Konstruktor 
    };
    
    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;
      int valueNo;
      std::vector<XYvalue> values;  
      double minX, minY,maxX, maxY, xFactor, yFactor;
      QColor farbe;
      protected:
    
     virtual void paintEvent( QPaintEvent *ev);
    
    }; 
    
    #endif
    

    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); // 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(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);
       p.setPen( Qt::red) ;
       xp = -minX * xFactor;
       yp = maxY * yFactor;
       p.drawLine( 0, int(yp), width(), int(yp) );  
       p.drawLine( int(xp), 0, int(xp), height() ); 
    
        xpAlt = xp = ( values[0].x - minX ) * xFactor;
        ypAlt = yp = ( maxY - values[0].y ) * yFactor;
       p.setPen( Qt::black);
    
       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();
    }
    

    bin für jede Tipps sehr Dankbar



  • ich habe versucht , die classe in zwei QWidget zuverteilen 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 nichr rauslesen
    hier was ich versucht habe:

    project.h

    struct XYvalue{
      double x;
      double y;
      XYvalue(double x, double y):x(x),y(y){}  //  Konstruktor 
    };
    
    class MyWidget :public QWidget
    {
    
     Q_OBJECT
    public:
       MyWidget(void);
       double get_xmin();    // liefert xmin zurueck
       double get_xmax();   //liefer xmax zurueck
    
    private:
      QPushButton *plot;
      QLineEdit* xmin ;
      QLineEdit* xmax;
    };
    
    class FUNCPLOT :public QWidget
    {
    
      Q_OBJECT
    
    public:
    
      FUNCPLOT(int n, QWidget *p=NULL,Qt::WindowFlags f=0);
    
    public slots:
      void plotten(double xmin, double xmax);
    
    private: 
      int valueNo;
      std::vector<XYvalue> values;  
      double minX, minY,maxX, maxY, xFactor, yFactor;
      QColor farbe;
    
     protected:
    
     virtual void paintEvent( QPaintEvent *ev);
    
    };
    
    #endif
    

    project.cpp

    MyWidget::MyWidget(void){
    
      xmin = new QLineEdit(this);  // Text-Feld
      xmin->setText( "0" );
      xmax= new QLineEdit(this);  // Text-Feld
      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);
    }
    
    double MyWidget::get_xmin(){
    
     double tmin = (xmin->text()).toDouble();
    return tmin;
    }
    
    double MyWidget::get_xmax(){
    
      double tmax = (xmax->text()).toDouble();
    return tmax;
    }
    
    FUNCPLOT::FUNCPLOT( int n, QWidget *p, Qt::WindowFlags f )  //new
           : QWidget( p, f ) {
    
      valueNo = n;
       int i;
       for (i=0; i<n; i++ ){
       values.push_back( XYvalue(0,0));
       }
    
     }
    
    void FUNCPLOT::plotten(double tmin ,double tmax) { 
      double X=0;
      double Y=0;
    
      double xr=(double)(tmax-tmin)/psize;
     values.clear();
     X=tmin;
      for(int i=0; i<psize; i++){
        // Y=sin(2*3.14*X);
          Y=sin(X);
      values.push_back(XYvalue(X,Y));
       X+=xr;
      }
      update();
    }
    
    void FUNCPLOT::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);
       p.setPen( Qt::red) ;
       xp = -minX * xFactor;
       yp = maxY * yFactor;
       p.drawLine( 0, int(yp), width(), int(yp) );  
       p.drawLine( int(xp), 0, int(xp), height() ); 
    
        xpAlt = xp = ( values[0].x - minX ) * xFactor;
        ypAlt = yp = ( maxY - values[0].y ) * yFactor;
       p.setPen( Qt::black);
    
       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)
    {
    
      double min ,max;
    
      QApplication app(argc,argv);
      QWidget* mywidget = new MyWidget();     //(psize);
      mywidget->resize(200,300);
      mywidget->show();
    
      min=mywidget.get_xmin();
      max=mywidget.get_xmax();
    
     QWidget* funcplot=new FUNCPLOT(psize);
      funcplot.plotten(min,max);
    
      QObject::connect(mywidget.plot,SIGNAL(clicked()),this,SLOT(funcplot.plotten(min,max)));  //???
     funcplot->resize(200,300);
      funcplot->show();
     return app.exec();
    }
    


  • Hast du die Qt-Doku eigentlich schon mal gelesen?
    Arbeite mal die Tutorials und Examples durch und versuch alles zu verstehen.


Anmelden zum Antworten