gpt4 book ai didi

qt - 如何在 Qt 中临时断开与插槽的信号?

转载 作者:行者123 更新时间:2023-12-03 11:00:46 25 4
gpt4 key购买 nike

我用信号连接一个插槽。但现在我想暂时断开它们。

这是我的类(class)声明的一部分:

class frmMain : public QWidget
{
...
private:
QTimer *myReadTimer;
...
private slots:
void on_btnDownload_clicked();
...
};

frmMain 的构造函数中,我连接 myReadTimer带有一个插槽,以便 ReadMyCom将每 5 秒调用一次:
myReadTimer=new QTimer(this);
myReadTimer->setInterval(5000);
connect(myReadTimer,SIGNAL(timeout()),this,SLOT(ReadMyCom()));

但是,在插槽 on_btnDownload_clicked .我不要 myReadTimeron_btnDownload_clicked 中发出任何信号的范围。所以我想在 on_btnDownload_clicked 开头断开它们最后重新连接它们。像这样:
void frmMain::on_btnDownload_clicked()
{
//some method to disconnect the slot & singal

...//the code that I want myReadTimer to leave me alone

//some method to reconnect the slot & singal
}

我在 Stackoverflow 中搜索并得到了一些答案,例如调用 QObject析构函数。但我不知道如何使用它。

我也尝试使用 disconnect , 像:
QMetaObject::Connection myConnect;
myConnect=connect(myReadTimer,SIGNAL(timeout()),this,SLOT(ReadMyCom()));
...
disconnect(& myConnect);

但它仍然不起作用。那么任何人都可以帮助我如何做到这一点?

最佳答案

QObject 中有一个很好的功能时不时派上用场:QObject::blockSignals()
这是一个非常简单的即发即弃的类(class),可以满足您的要求。我不相信它的设计,我很久以前在互联网上的某个地方找到了它。但要小心,它会阻止所有对象的所有信号。如果这不是您想要的,您可以修改类以满足您的需要。

class SignalBlocker{
public:
SignalBlocker(QObject *o): object(o), alreadyBlocked(object->signalsBlocked()){
if (!alreadyBlocked){
object->blockSignals(true);
}
}
~SignalBlocker() {
if (!alreadyBlocked){
object->blockSignals(false);
}
}

private:
QObject *object;
bool alreadyBlocked;
};

在您的情况下,使用变得微不足道
void frmMain::on_btnDownload_clicked()
{
SignalBlocker timerSignalBlocker(myReadTimer);

...//the code that I want myReadTimer to leave me alone

// signals automatically unblocked when the function exits
}

更新:

我看到从 Qt 5.3 开始,一个非常相似的类已正式添加到 API 中。它的功能与上面的类似,但功能集稍大。建议你使用官方 QSignalBlocker类,以使您的代码库随任何 API 更改保持最新。

但是,用法仍然完全相同。

关于qt - 如何在 Qt 中临时断开与插槽的信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524925/

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