Qtimer使用多次connect的误区

本人目前小白一枚,所及问题只为方便查看,忘大神们勿喷,有指导意见的本人会很高兴(〃'▽'〃)

在使用一个定时器时多次调用start()和stop()时完全没有问题的,先讲一下是start()的作用:

Qt的帮助文档如下:

This is an overloaded function.
Starts or restarts the timer with a timeout of duration msec milliseconds.
If the timer is already running, it will be stopped and restarted.
If singleShot is true, the timer will be activated only once.

也就是说每次调用start ()如果定时器仍在运行,将会被停止,再开启(此时重新计数)。

下面是我的问题

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->setSingleShot(true);
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    connect(timer,&QTimer::timeout,this,&MainWindow::add);
    timer->start(3000);
}

void MainWindow::add()
{
    if(timer->isActive()){
        timer->stop();
}

    ui->textEdit->append(tr("123"));
}

void MainWindow::on_pushButton_2_clicked()
{
    if(timer->isActive())
        timer->stop();
}

我希望没点一次按键,3s后增加一次“123”,所以在点击事件中start()并connect(),这就导致增加“123”的数量会随着点击按键的次数增加。这是因为此时程序没点击一次就会建立一次新的connect(),所以应保证connect仅执行一次。程序修改如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->setSingleShot(true);
    connect(timer,&QTimer::timeout,this,&MainWindow::add);
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    timer->start(3000);
}

void MainWindow::add()
{
    if(timer->isActive()){
        timer->stop();}

    ui->textEdit->append(tr("123"));
}

void MainWindow::on_pushButton_2_clicked()
{
    if(timer->isActive())
        timer->stop();
}

 

在Qt中,使用`QTimer`注册回调函数的基本步骤如下: 1. **创建QTimer实例:** 首先,你需要创建一个`QTimer`对象,例如: ```cpp QTimer *timer = new QTimer(this); ``` 这里,`this`代表你的QObject(通常是窗口类),`timer`将是这个QObject的成员变量。 2. **设置定时器的单次或者周期:** 根据需求,你可以选择定时器是运行一次还是周期性运行。比如设置1秒钟后执行一次: ```cpp timer->setInterval(1000); // 单位通常是毫秒 ``` 或者设置定期每隔500毫秒执行: ```cpp timer->setInterval(500); ``` 3. **连接回调函数:** 使用`connect`函数将定时器的`timeout()`信号连接到一个槽函数,即你要在指定时间点执行的操作: ```cpp connect(timer, &QTimer::timeout, this, [yourCallbackObject](){ // yourCallbackObject是一个QObject实例,这里可以是你自己或其他QObject yourCallbackObject->yourFunctionToBeCalled(); }); ``` 如果你想在回调函数执行完毕后再触发下一次,应使用`SLOT()`宏: ```cpp connect(timer, &QTimer::timeout, SLOT(yourMethod())); ``` 4. **启动定时器:** 最后,调用`start()`方法启动定时器: ```cpp timer->start(); ``` 5. **移除回调:** 当不需要定时器了,记得关闭它并断开连接,避免内存泄漏: ```cpp disconnect(timer, &QTimer::timeout, this, ...); timer->deleteLater(); // 或者 timer->stop(); ``` 这就是使用`QTimer`在Qt中注册回调函数的基本过程。记得确保你的槽函数是线程安全的,因为`timeout()`信号可能会在其他线程中触发。如果你不确定,可以考虑使用`QMetaObject::invokeMethod()`或`post()`函数来执行槽函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值