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.hstruct 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 einupdate()
.Der Plot wird allerdings als "Hintergrund" gemalt.
Wenn du das in einem eigenen Bereich haben willst, musst den Inhalt derpaintEvent()
-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.cppMyWidget::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.