In Qt I'm trying to set a QTimer that calls a function called "update" every second. Here is my .cpp file:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QTimer> #include "QDebug" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(1000); } MainWindow::~MainWindow() { delete ui; } void MainWindow::update() { qDebug() << "update"; } and the main:
#include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } The project is being build, but it doesn't execute update, since the line "update" is not showing anywhere... Does anybody see what I´m doing wrong?
43 Answers
Other way is using of built-in method start timer & event TimerEvent.
Header:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; int timerId; protected: void timerEvent(QTimerEvent *event); }; #endif // MAINWINDOW_H Source:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); timerId = startTimer(1000); } MainWindow::~MainWindow() { killTimer(timerId); delete ui; } void MainWindow::timerEvent(QTimerEvent *event) { qDebug() << "Update..."; } 2It's good practice to give a parent to your
QTimerto use Qt's memory management system.update()is a QWidget function - is that what you are trying to call or not? .If number 2 does not apply, make sure that the function you are trying to trigger is declared as a slot in the header.
Finally if none of these are your issue, it would be helpful to know if you are getting any run-time connect errors.
mytimer.h:
#ifndef MYTIMER_H #define MYTIMER_H #include <QTimer> class MyTimer : public QObject { Q_OBJECT public: MyTimer(); QTimer *timer; public slots: void MyTimerSlot(); }; #endif // MYTIME mytimer.cpp:
#include "mytimer.h" #include <QDebug> MyTimer::MyTimer() { // create a timer timer = new QTimer(this); // setup signal and slot connect(timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot())); // msec timer->start(1000); } void MyTimer::MyTimerSlot() { qDebug() << "Timer..."; } main.cpp:
#include <QCoreApplication> #include "mytimer.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create MyTimer instance // QTimer object will be created in the MyTimer constructor MyTimer timer; return a.exec(); } If we run the code:
Timer... Timer... Timer... Timer... Timer... ...