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.