Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

QTimer

QTimerを即タイムアウトさせる

更新日:

先に結論

QTimerのtimeout関数に、{}を渡すだけ。

timer->timeout({});

 

使いどころあるの?

timeoutシグナルに対してconnectしたスロット関数を、以降変更しないのであれば、QTimerをstartする前に直接スロット関数を1回呼んでやればいいだけですね。
ですが、条件によってconnectするスロット関数を変える場合、timeoutを呼ぶだけの方が便利です。

 

サンプル

ボタンとラベルを配置。
ボタンを押すと、押した瞬間にラベルの数値がインクリメントされ、以降ボタンを押している間、1秒毎にインクリメントされます。

 

ヘッダ。

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_pressed();
    void on_pushButton_released();

private:
    Ui::MainWindow *ui;
    QTimer *timer;
    int val;
    void timerFunc();
};

 

ソース。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    timer(nullptr),
    val(0)
{
    ui->setupUi(this);
    ui->label->setText(QString::number(val));
    timer = new QTimer(this);
    connect(timer,  &QTimer::timeout, this, &MainWindow::timerFunc);
}

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

void MainWindow::on_pushButton_pressed()
{
    timer->timeout({});
    timer->start(1000);
}

void MainWindow::on_pushButton_released()
{
    timer->stop();
}

void MainWindow::timerFunc()
{
    val++;
    ui->label->setText(QString::number(val));
}

-QTimer
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.