gpt4 book ai didi

qt - 延迟发射信号

转载 作者:行者123 更新时间:2023-12-05 03:51:57 24 4
gpt4 key购买 nike

我想要实现的目标是发出一个信号,但在它实际发出之前延迟一段时间。

我的想法是这样的:

emitLater(QObject *obj, QEvent *event, int msDelay)
{
QTimer...
connect(timout to obj and event...
start timer with msDelay...

//maybe I might need a public timer of some sort but the idea is clear
}

所以这种方法因 QEvent 参数而失败,因为信号无法转换为 QEvents

我尝试使用 std::bind 调用几个变体,但我无法让它工作:

//the call
std::function<void(void)> signal = std::bind(&CustomPushButton_Header::clicked, &uiWindow->btnHeader_left); //just a random button to connect a valid signal
emitLater(signal, 2000);

//the function
emitLater(std::function<void(void)>, int msDelay)
{
qDebug() << "hi";
}

我希望有一个适用于所有对象和所有信号的解决方案……也许只适用于调用该函数的部分。我认为延迟会很容易。

或者您有不同的甚至更简单的方法。那就太好了。

我查看的一些来源:

最佳答案

有一个函数 QTimer::singleShot() 可以在一定时间后触发信号/槽。我是这样实现的:

void MyWindow::emitLater(const QObject *obj, const char *signalOrSlot, int msDelay)
{
//use QTimer::singleShot() to trigger the signal/slot after a certain amount of time
QTimer::singleShot(msDelay, obj, signalOrSlot);
}

并像这样使用它:

void MyWindow::on_pushButton_5_clicked()
{
//trigger the "doing fancy stuff" function after 5 seconds (= 5000 ms)
emitLater(this, SLOT(setText()), 5000);
}

void MyWindow::setText()
{
//do some fancy stuff
ui->label_3->setText("Hello World!");
}

另一种选择是在 answer from ΦXocę 웃 Пepeúpa ツ 中并使用 lambda 表达式作为 QTimer::timout() 信号的调用函数:

void MyWindow::on_pushButton_5_clicked()
{
//initialize timer
QTimer* t= new QTimer(this);
t->setSingleShot(true);

//do some fancy stuff after timeout
connect(t, &QTimer::timeout, [this]()
{
ui->label_3->setText("Hello World!");
});

//start the timer with delay of 5 seconds (= 5000 ms)
t->start(5000);
}

关于qt - 延迟发射信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62511787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com