2016-08-19 2 views
1

저는 QT5를 처음 사용하고 있으며, 매우 이상한 문제가 있습니다. QTimer를 사용하여 0.5 초마다 좌표계를 읽으려고하지만 QTimer가 시간 초과 신호를 보내지 않습니다.Qt5는 타임 아웃 신호를 보내지 않습니다

내 .H :

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

public slots: 
    void test(); 

private: 
    Ui::MainWindow *ui; 
}; 

내 통화 당 : 내가 추가

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QTimer myTimer(this); 
    myTimer.setInterval(500); 
    myTimer.setSingleShot(false); 
    connect(&myTimer, SIGNAL(timeout()), this, SLOT(test())); 
    myTimer.start(); 
} 

void MainWindow::test() { 
    qDebug() << "Time out"; 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

나는 프로그램이 아닌 하나의 "시간 초과"나타 시작 후 ...

"myTimer.start()"다음의 코드 :

QTime t = QTime::currentTime().addMSecs(550); 
while (QTime::currentTime() < t) { 
    qDebug() << myTimer.remainingTime(); 
} 

는 그리고 "을 MyTimer"의 남은 시간이 0으로 감소 후에는 남은 시간을 보충하고 다시 시작되지 않습니다 발견, 이미

사람이있어 추가 0

Q_OBJECT 유지 생각?

대단히 감사합니다!

+0

요청시 실제 코드를 복사하여 붙여 넣으십시오. 'myTimer'와'mytimer'는 다른 식별자이고,';; '는 함수 인자 목록을 완성하는 유효한 구문이 아니기 때문에 첫 번째 코드는 컴파일되지 않습니다. – Sergey

+0

코드에서'QTimer myTimer; '를 선언하고 후속 행을 작성합니까? – Sergey

+0

@Sergey 죄송합니다. 방금 질문을 편집했으며 .h 및 .cpp 파일을 붙여 넣었습니다. –

답변

2

문제는 여기에 있습니다 : 그것은 생성자를 반환 즉시 파괴 될 수 있도록 생성자에서

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QTimer myTimer(this); 
    myTimer.setInterval(500); 
    myTimer.setSingleShot(false); 
    connect(&myTimer, SIGNAL(timeout()), this, SLOT(test())); 
    myTimer.start(); 
} 

당신은 자동으로 myTimer을 선언했다. 이렇게하면 시간 초과 이벤트가 발생할 때까지 myTimer은 더 이상 존재하지 않으므로 신호를 보낼 수 없습니다!

해결책은 간단하다 : myTimer 모든 시간 MainWindow 개체의 삶을 존재, 그렇게하지 그것의 생성자에서 클래스에서 선언하고 동적으로 할당해야합니다

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

public slots: 
    void test(); 

private: 
    QTimer *myTimer; // <--- pointer declaration. 
    Ui::MainWindow *ui; 
}; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    // Allocating actual QTimer object: 
    myTimer = new QTimer(this); 
    // Calling methods by object pointer: 
    myTimer->setInterval(500); 
    myTimer->setSingleShot(false); 
    connect(myTimer, SIGNAL(timeout()), this, SLOT(test())); 
    myTimer->start(); 
} 

MainWindow::~MainWindow() 
{ 
    // Don't forget to delete after usage. 
    delete myTimer; 
    delete ui; 
} 
+0

고맙습니다. 제 문제가 해결되었습니다! –

0

을 MyTimer 지역이다.

반원으로하여 사용하십시오. 효과가있을 것입니다.

관련 문제