Qt是否提供功能以知道特定槽处理的挂起信号数量? 有没有方法清除它们? 例如,如果在连接到给定槽的信号上执行了几个发射操作,某人如何知道这些发射信号的数量?
QMetaObject :: Connection类具有简洁的接口,似乎不提供相关功能。 删除接收信号的对象,从而销毁连接,解决了问题。 但是,是否有一种方法可以在不断开插槽或删除接收对象的情况下完成此操作?
Qt是否提供功能以知道特定槽处理的挂起信号数量? 有没有方法清除它们? 例如,如果在连接到给定槽的信号上执行了几个发射操作,某人如何知道这些发射信号的数量?
QMetaObject :: Connection类具有简洁的接口,似乎不提供相关功能。 删除接收信号的对象,从而销毁连接,解决了问题。 但是,是否有一种方法可以在不断开插槽或删除接收对象的情况下完成此操作?
// all direct-connected slots/functors are invoked before mySignal() returns
emit mySignal();
update()
,然后在调用时使用paintEvent()
中的当前值。这些自动压缩,所以无论update()
被调用多少次,都只会有一个重绘事件。// in constructor, set mActualSlotTimer to
// singleshot, interval 0, parent this (needed for multi-threaded use)
// and connect timeout() to privateActualSlot()
// public slot for receiving the signal from outside
void MyClass::actualSlot(int data) {
// class member to store the new data value until it can be set
mNewData = data;
// restart the timer, no matter if it was already running or not
mActualSlotTimer.start();
}
// "private" slot for actually doing the change
void MyClass::privateActualSlot() {
// maybe useful: if (this->mData == this->mNewData) return;
mData = mNewData;
// do whatever else needs to be done!
}
显然,如果您的公共槽实际上不需要任何参数,则不需要使用mData
和mNewData
。
关于这种方法需要注意的一点是,它适用于所有连接,而不仅限于Qt::QueuedConnecton
。因此,它也使得使用Qt::BlockingQueuedConnection
有点无意义。
免责声明:我简要检查了Qt源代码,似乎使用间隔为0的计时器应该没问题:重新启动计时器将按预期工作。但是,如果对privateActualSlot
的调用仍然过多,则可能需要提供适当的间隔。我通常希望有一点延迟(例如5毫秒)来将事情减缓一些,而不是“尽可能频繁”,因此没有在间隔为0的情况下进行过广泛测试。
update()
来利用事件压缩。否则,如果您正在使用自己的事件,请压缩它们。 - Kuba hasn't forgotten MonicaQWidget::update()
特殊情况的注释。我认为这种情况更常见的需要是当信号来自 GUI(用户可以快速点击),或者来自网络或其他外部源时,这些源不需要关心信号目标是否能跟上。那么相对于像你在另一个问题中所示的添加自定义代理类,使用 QTimer 类来压缩单个信号是否存在具体的缺点? - hyde