QT - QTimer löst nicht Ereignis aus



  • Leider bin ich blutiger Anfänger. Deshalb wollte ich etwas üben, aber nach dem ich nichtmal die Beispiele aus der mitgelieferen QT 4.3.-Version Compilieren konnte frage ich doch mal nach.

    Ziel ist es eine einfache Uhr zu schreiben (ohne QT-Designer). Hab schon MessageBox eingebaut (um zu testen wie oft die eigentliche update-Funktion aufgerufen wird -> Ergebnis nur der Aufruf im Konstruktor), genauso wie einen manuellen "Update-Button" (auch kein Aufruf möglich) ... vielleicht sieht ja jemand meinen Fehler.

    Hier der Code (hoffe das die ganze Datei net zu lang ist):

    #include <QApplication>
     #include <QMessageBox>
     #include <QPushButton>
     #include <QLCDNumber>
     #include <QVBoxLayout>
     #include <QHBoxLayout>
     #include <QWidget>
     #include <QTime>
     #include <QTimer>
    
     class ClockWidget : public QWidget
     {
    	public:
    			QPushButton *QuitButton;
    			QPushButton *GetTime;
    			QLCDNumber  *HourLCD;
    			QLCDNumber  *MinuteLCD;
    			QLCDNumber  *SecondLCD;
    
    	public:
    				 ClockWidget(QWidget *parent = 0);
    	private slots:
    			void updateWidget();			
     };
    
     ClockWidget::ClockWidget(QWidget *parent) : QWidget(parent)
     {
       	 QuitButton = new QPushButton(tr("Uhr schließen"));
    	 GetTime    = new QPushButton(tr("Aktualisiere"));
    
    	 HourLCD    = new QLCDNumber();
    	 MinuteLCD  = new QLCDNumber();
    	 SecondLCD  = new QLCDNumber();
    
    	 QTimer		*Clocktimer = new QTimer(qApp);
    
         QVBoxLayout *WindowLayout = new QVBoxLayout();
    	 QHBoxLayout *ClockLayout  = new QHBoxLayout();
    
    	 WindowLayout ->addLayout(ClockLayout);
    	 WindowLayout ->addWidget(QuitButton);
    	 WindowLayout ->addWidget(GetTime);
    	 ClockLayout  ->addWidget(HourLCD);
    	 ClockLayout  ->addWidget(MinuteLCD);
    	 ClockLayout  ->addWidget(SecondLCD);
    
    	 setLayout(WindowLayout);
    	 setLayout(ClockLayout);
    
    	 //QTime *Systemtime = new QTime();
    	 connect(Clocktimer, SIGNAL(timeout()), this, SLOT(updateWidget()));
    	 connect(GetTime   , SIGNAL(clicked()), this, SLOT(updateWidget()));
    	 //connect(Clocktimer, SIGNAL(timeout()),SecondLCD, SLOT(display(Systemtime->second)));
    	 connect(QuitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
    
    	 Clocktimer -> start(100);
    	 updateWidget();
    
     }
    
     void ClockWidget::updateWidget()
     {
    	 	   QMessageBox::warning ( this, "UpdateWidget", "Beginn");
    	 QTime *Systemtime = new QTime();
    	 Systemtime ->start();
    	 HourLCD    ->display(Systemtime->hour());
    	 MinuteLCD  ->display(Systemtime->minute());
    	 SecondLCD  ->display(Systemtime->second());
    	 SecondLCD  ->update();
    	 delete Systemtime;
    	 QMessageBox::warning ( this, "UpdateWidget", "Ende");
     }
    
     void ClockApplication()
     {
    
     }
    
     int main(int argc, char *argv[])
     {
    	 QApplication *Application = new QApplication(argc, argv);
    
    	 ClockApplication();
    	 ClockWidget   *ClockWindow = new ClockWidget();
    	 ClockWindow -> show();
    	 //ClockWindow -> updateWidget();
    	 return Application->exec();
     }
    


  • class ClockWidget : public QWidget
     {
        Q_OBJECT
        [...]        
     };
    

    dieses Makro musst du immer dann in die Klassendeklaration einfügen, wenn du Signals und Slots verwenden willst.

    Danach musst du aber erneut qmake ausführen, sonst meckert der Linker 😉



  • class ClockWidget : public QWidget
     {
        Q_OBJECT
    	public:
    			QPushButton *QuitButton;
    			QPushButton *GetTime;
    			QLCDNumber  *HourLCD;
    			QLCDNumber  *MinuteLCD;
    			QLCDNumber  *SecondLCD;
    
    	public:
    				 ClockWidget(QWidget *parent = 0);
    	private slots:
    			void updateWidget();			
     };
    

    Erledigt ... hab jetzt aber (auch nach qmake) diese Fehlermeldung und bekomm sie net weg ...

    release/main.o(.text+0x3f2):main.cpp: undefined reference to ClockWidget::staticMeta release/main.o(.text+0x3f8):main.cpp: undefined reference tovtable for ClockWidget'

    Hab schon gesucht, aber irgendwie will er net ... Semikolon hinter Q_OBJECT bringt auch nix ... 😡



  • habs grad getestet. Geholfen hat bei mir, das ich das Projekt entsprechend in einzelne Dateien aufgespalten hab (clockwidget.h, clockwidget.cpp und main.cpp)

    offensichtlich springt der moc sonst nicht an



  • Ich werds gleich mal testen ... hoffe das ich da nix mehr beachten muss ... (nehm mir immer diverse Tuts als Vorbild)



  • zwutz schrieb:

    habs grad getestet. Geholfen hat bei mir, das ich das Projekt entsprechend in einzelne Dateien aufgespalten hab (clockwidget.h, clockwidget.cpp und main.cpp)

    offensichtlich springt der moc sonst nicht an

    Alternativ kannst du auch die vom MO-Compiler erzeugten Dateien per Include einbinden, wenn es in einer Datei bleiben soll.



  • Funktioniert super ... konnte mich vor Messages gar nicht retten 😉 ... Timer läuft und Uhr zählt *jubel* Danke für die schnelle Hilfe.

    Wie meinste das mit der Alternative?

    @Admin / Mod ... hab mich inzwischen angemeldet ... bitte Titel auf glöst setzen.



  • ProgChild schrieb:

    Alternativ kannst du auch die vom MO-Compiler erzeugten Dateien per Include einbinden, wenn es in einer Datei bleiben soll.

    das problem ist ja gewesen, dass der moc gar keine Dateien erzeugt hat, die man einbinden hätte können 😉



  • zwutz schrieb:

    das problem ist ja gewesen, dass der moc gar keine Dateien erzeugt hat, die man einbinden hätte können 😉

    Da hilft es (meiner Erfahrung nach), wenn man nochmal qmake -project aufruft.



  • Ich hab mehrmals das ganze Compiler-(und Co)-Prozedere durchgemacht ... qmake -project, qmake, make ... alles ohne irgendeinen Effekt ... könnte sowas an irgendwelchen Programmen oder Versionen hängen (BUGS in vielleicht in einer neueren Version behoben)?



  • ProgChild schrieb:

    Da hilft es (meiner Erfahrung nach), wenn man nochmal qmake -project aufruft.

    nein, hilft in dem Fall garnix. Dadurch wird nur die qmake-Datei anhand der vorhandenen Dateien neu aufgebaut. Desweiteren sind in der qmake-Datei keinerlei Informationen für den moc enthalten

    Akaya schrieb:

    (BUGS in vielleicht in einer neueren Version behoben)?

    habs mit qt4.3.3 getestet. Aktuelle stable ist 4.3.4. Dahingehend gabs aber keine Änderungen (ich denke auch nicht, dass das ein Bug ist)



  • zwutz schrieb:

    nein, hilft in dem Fall garnix. Dadurch wird nur die qmake-Datei anhand der vorhandenen Dateien neu aufgebaut. Desweiteren sind in der qmake-Datei keinerlei Informationen für den moc enthalten

    Okay. In dem Punkt korregiere ich mich. Du brauchst kein qmake -project . Es reicht aus, wenn dein Programm in der Datei main.cpp gespeichert ist, darin ein

    #include "main.moc"
    

    einzufügen und qmake && make aufrufen, damit der MOC anspringt. Gerade mit QT 3.3.7 ausprobiert. (Weis nicht, ob das qmake überflüssig war).

    Wie ich ja vorher schon geschrieben habe.



  • ProgChild schrieb:

    Es reicht vollkommen aus, wenn dein Programm in der Datei main.cpp gespeichert ist, darin ein

    #include "main.moc"
    

    einzufügen, damit der MOC anspringt. Gerade mit QT 3.3.7 ausprobiert.

    hm... is mir neu... aber ok, nachdem ich eh immer alles in mehrere Dateien aufspalte und die main.cpp auch nur die main-Funktion enthält, konnt ichs ja net wissen ^^
    Probiers aber morgen mit Qt4 aus. Das interessiert mich jetzt



  • Hab noch ein neues Problem ...

    Die Anwendungs selbst läuft jetzt Fehlerfrei (abgesehen, dass meine Uhr ne halbe Sekunde vor der Windowsuhr läuft ;)) aber ich kann den segmentSyle der LCDs nicht ändern.

    Müsste ja eigentlich so funktionieren:

    HourLCD -> setSegmentStyle(Filled);
    

    bzw.

    HourLCD -> segementStyle = Filled;
    

    (Der Code wurde nach der Initialiserung im Konstruktor (wie im ersten Beitrag) eingefügt.)
    Header QTGui ist eingefügt (denke es müssten dadurch fast alle Graphischen Komponenten bekannt sein).

    Auch über das Ansprechend der Eigenschaft durch die im enum zugewiesene Nummer ( Filled entspricht ja nach QTAssistent dem Wert 1) läuft nicht. Der Compiler (make) bringt jedes mal diverse Fehler.

    Kann mir jemand weiterhelfen?


Anmelden zum Antworten