簡體   English   中英

Qt5不會發送超時信號

[英]Qt5 won't send timeout signal

我是QT5的新手,但遇到一個非常奇怪的問題。 我想使用QTimer每0.5秒從串行設備讀取坐標,但是QTimer不會發送超時信號。

我的.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已添加

有人知道嗎?

非常感謝你!

問題在這里:

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;
}

myTimer是本地的。

使其成為班級成員並使用它。 它會工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM