*Newbie* Von Funktion QLCDNumber übertragen

Alles rund um die Programmierung mit Qt
Antworten
RoninRobert
Beiträge: 6
Registriert: 10. September 2004 18:01

*Newbie* Von Funktion QLCDNumber übertragen

Beitrag von RoninRobert »

Hallo
Bin noch totaler Anfänger und suche seit Stunden nach einer Lösung für folgendes Problem:
Ich möchte aus einer Funktion heraus Werte an Objekte der QLCDNumber übertragen. Am besten ich poste den ganzen Code mal:

Code: Alles auswählen

class QLCDNumber;

class MyWidget : public QWidget
{
public:
	MyWidget(QWidget *parent=0,const char *name=0);
        void ber();


private:
    QLCDNumber *lcdday;
    QLCDNumber *lcdmin;
    QLCDNumber *lcdsec;
    QLCDNumber *lcdstd;
};

MyWidget::MyWidget( QWidget *parent, const char *name)
         :QWidget(parent,name)
{
	setMinimumSize(220,120);
	setMaximumSize(500,120);

	QPushButton *quit =new QPushButton("Quit",this,"quit"); //quit Button
	quit->setGeometry(140,90,75,30);
        quit->setFont(QFont("Times",15));
	connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));



	QLCDNumber *lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage
	lcdday->setGeometry(10,20,50,30);
 QLCDNumber *lcdstd =new QLCDNumber(3,this,"lcdstd"); //lcd Stunden
	lcdstd->setGeometry(60,20,50,30);
	QLCDNumber *lcdmin =new QLCDNumber(3,this,"lcdmin"); //lcd Minuten
	lcdmin->setGeometry(110,20,50,30);
 QLCDNumber *lcdsec =new QLCDNumber(3,this,"lcdsec"); //lcd Sekunden
	lcdsec->setGeometry(160,20,50,30);


	}

void MyWidget::ber()
{
    QDateTime dt = QDateTime::currentDateTime();
    QDateTime xmas( QDate(2004, 10, 01 ),     QTime(21,00) );
    QDate lala( 2004, 10, 01 );

    int tage = (QDate::currentDate().daysTo(lala));
    int sec= dt.secsTo(xmas);
    int rstd=(sec-(tage*24*60*60))/60/60;
    int rmin=((sec-(rstd*60*60))-(tage*24*60*60))/60;
    int rsec=(sec-(tage*24*60*60)-(rstd*60*60)-(rmin*60));
    lcdday->display(tage);                        // <---- Hier soll der Wert übergeben werden
    lcdstd->display(rstd);
    lcdmin->display(rmin);
    lcdsec->display(rsec);

    }

  int main(int argc,char **argv)
 {
       QApplication a(argc,argv);


	MyWidget w;
	w.setGeometry(100,100,200,120);
	a.setMainWidget(&w);
        w.show();
	return a.exec();

 }

Ich bekomm zwar keine Fehlermeldung, aber ich weiß nicht, wo ich die Funktion ber() aufrufen soll, damit die Werte korrekt angeziegt werden. Wenn ich die Funktion direkt in das Objekt MyWidget setze, bekomme ich die Fehlermeldung: Segmentation fault
Kann auch sein, dass da sonst noch Fehler sind, weil ich wie gesagt noch Anfänger bin und versuche mir das ein wenig beizubringen, deswegen würde ich mich über Hilfe sehr freuen.
Danke schon mal im Vorraus

Robert
martin
Beiträge: 10
Registriert: 25. August 2004 18:03

Beitrag von martin »

display()ist ein Slots somit müss er über ein Signal angesprochen werden:

Code: Alles auswählen

class QLCDNumber; 
 
 class MyWidget : public QWidget 
 { 
   Q_OBJECT
public: 
    MyWidget(QWidget *parent=0,const char *name=0); 
    void ber();	  
    QLCDNumber *lcdday; 
    QLCDNumber *lcdmin; 
    QLCDNumber *lcdsec; 
    QLCDNumber *lcdstd;
signals:
    int _day(int);
    int _min(int);
    int _sec(int);
    int _std(int);       
 }; 
 
 MyWidget::MyWidget( QWidget *parent, const char *name):QWidget(parent,name) 
 { 
    setMinimumSize(220,120); 
    setMaximumSize(500,120); 
 
    QPushButton *quit =new QPushButton("Quit",this,"quit"); //quit Button 
    quit->setGeometry(140,90,75,30); 
       quit->setFont(QFont("Times",15)); 
    connect(quit,SIGNAL(clicked()),qApp,SLOT(quit())); 
 
 
 
    lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage 
      lcdday->setGeometry(10,20,50,30); 
    lcdstd =new QLCDNumber(3,this,"lcdstd"); //lcd Stunden 
      lcdstd->setGeometry(60,20,50,30); 
    lcdmin =new QLCDNumber(3,this,"lcdmin"); //lcd Minuten 
      lcdmin->setGeometry(110,20,50,30); 
    lcdsec =new QLCDNumber(3,this,"lcdsec"); //lcd Sekunden 
      lcdsec->setGeometry(160,20,50,30); 
      
    connect(this,SIGNAL(_day(int)),lcdday,SLOT(display(int))); 
    connect(this,SIGNAL(_std(int)),lcdstd,SLOT(display(int))); 
    connect(this,SIGNAL(_min(int)),lcdmin,SLOT(display(int))); 
    connect(this,SIGNAL(_sec(int)),lcdsec,SLOT(display(int))); 
  
    this->ber();//Man muss zumindest ein mal ber() funktion aufrufen   
    } 
 
 void MyWidget::ber() 
 { 
     QDateTime dt = QDateTime::currentDateTime(); 
     QDateTime xmas( QDate(2004, 10, 01 ),     QTime(21,00) ); 
     QDate lala( 2004, 10, 01 ); 
 
     int tage = (QDate::currentDate().daysTo(lala)); 
     
     int sec= dt.secsTo(xmas); 
     emit _sec(sec);
     int rstd=(sec-(tage*24*60*60))/60/60; 
     emit _std(rstd);
     int rmin=((sec-(rstd*60*60))-(tage*24*60*60))/60; 
     emit _min(rmin);
     int rsec=(sec-(tage*24*60*60)-(rstd*60*60)-(rmin*60)); 
     emit _day(rsec);
 
     } 
 
   int main(int argc,char **argv) 
  { 
        QApplication a(argc,argv); 
 
 
    MyWidget w; 
    w.setGeometry(100,100,200,120); 
    a.setMainWidget(&w); 
         w.show(); 
    return a.exec(); 
 
  } 
Ich hoffe das prinzip ist dir jetzt klar.
Und frag mich nicht wie man den geänderten Quellencode ohen KDevelop kompiliert.Wenn ich es ohne KD kompieliere bekomme ich nur "undefined reference to...".
Zuletzt geändert von martin am 11. September 2004 13:10, insgesamt 2-mal geändert.
Intel Pentium 3.2GHz |RAM-512MB|DSL|OS - Suse Linux Professional 9.1/Windows XP home |
monte
Beiträge: 24
Registriert: 28. August 2004 17:04
Wohnort: Wiswiel
Kontaktdaten:

Beitrag von monte »


QLCDNumber *lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage
lcdday->setGeometry(10,20,50,30);
QLCDNumber *lcdstd =new QLCDNumber(3,this,"lcdstd"); //lcd Stunden
lcdstd->setGeometry(60,20,50,30);
QLCDNumber *lcdmin =new QLCDNumber(3,this,"lcdmin"); //lcd Minuten
lcdmin->setGeometry(110,20,50,30);
QLCDNumber *lcdsec =new QLCDNumber(3,this,"lcdsec"); //lcd Sekunden
lcdsec->setGeometry(160,20,50,30);

muss heißen :
lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage
lcdday->setGeometry(10,20,50,30);
lcdstd =new QLCDNumber(3,this,"lcdstd"); //lcd Stunden
lcdstd->setGeometry(60,20,50,30);
lcdmin =new QLCDNumber(3,this,"lcdmin"); //lcd Minuten
lcdmin->setGeometry(110,20,50,30);
lcdsec =new QLCDNumber(3,this,"lcdsec"); //lcd Sekunden
lcdsec->setGeometry(160,20,50,30);


Du hast ja in der Klassen definition schon beschrieben das
lcd*** vom Typ Pointer auf QLCDNumber ist wenn du das nu
nochmal vorne drann schreibst sind diese in der Klasse angelegten
Pointer undefiniert und beim Zugriff ergibt sich ein Segmention fault.

um die Funktion zu testen müsste man sie auch im Konstruktor aufrufen
können oder in main()

int main(int argc,char **argv)
{
QApplication a(argc,argv);


MyWidget w;
w.setGeometry(100,100,200,120);
a.setMainWidget(&w);
w.show();
w.ber();
return a.exec();

}[/quote]
martin
Beiträge: 10
Registriert: 25. August 2004 18:03

Beitrag von martin »

@monte
Eingentlich hast du recht, die Zeiger wurden schon deklariert in der Klassen-Deklaration:QLCDNumber *lcdday;
und eigentlich sollte das: QLCDNumber *lcdday =new QLCDNumber(3,this,"lcdday");
einen Fehler hervorrufen, ich habe es aber trotzdem erfolgreich kompiliert und ausgeführt.
Komisch.

Ich habe dennnoch den Code im vorigem Beitrag vor mir berichtigt.
Intel Pentium 3.2GHz |RAM-512MB|DSL|OS - Suse Linux Professional 9.1/Windows XP home |
RoninRobert
Beiträge: 6
Registriert: 10. September 2004 18:01

Beitrag von RoninRobert »

Danke für die schnelle Antwort. Ich habe einfach nur

Code: Alles auswählen


QLCDNumber *lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage 

in

lcdday =new QLCDNumber(3,this,"lcdday"); //lcd Tage 
geändert und es funktioniert, also musste ich nicht connecten.

Robert
Antworten