2016-08-19 5 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; 
}; 

私の.cpp:私は追加

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がローカルです。

これをクラスメンバーにして使用します。それが動作します。

関連する問題