我有一个小型 Qt 绘图应用程序,并且我正在基于“主”组合框启用/禁用小部件(组合/旋转框)。例如,假设主设备是,它会根据combo1更改 中的条目,启用/禁用,并为选择中的某个条目设置一个值。不过,还有更多的小部件。combo2currentIndex()spin1spin1combo1
在聊天中(及以后)的小讨论之后,我使用了Qt::QueuedConnectionevery connect(),但这并没有阻止重新启用的小部件在重新启用时发出信号。这导致我connect()对所有重新启用的小部件都执行了许多操作,从而导致了多次绘图,这是我想避免的。就像现在一样,(几乎)所有小部件都plot()在 a 内部使用connect(),因此它是一个插槽的多个信号。
我的问题:有没有办法防止在重新启用小部件时发出信号?我可以plot()使用一些bool来检查绘图是否已执行并阻止相同类型的进一步操作,但这仍然会导致小部件发出信号并运行plot(),即使检查会阻止实际绘图,但这并不会这似乎不是可行的办法。我还希望避免运行installEventFilter()或类似的操作,因为这很可能会比之前的修复速度更慢。
评论中已经提到的另一个选择是使用QObject::blockSignals:
combo1->blockSignals(true);
// do what ever you need
combo1->blockSignals(false);
Run Code Online (Sandbox Code Playgroud)
我发现它更容易使用和阅读。此外,在很多情况下您根本不知道/处理连接。
从 Qt 5.3 开始QSignalBlocker,您还拥有一个异常安全包装器blockSignals(在内部它使用 RAII 来阻止构造函数中的信号并在销毁时将它们恢复到之前的状态):
{
QSignalBlocker blocker{combo1}
// do what ever you need
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2014 次 |
| 最近记录: |