如何在启用/禁用qcombobox / qspinbox时停止发出信号

时间:2017-01-04 09:15:03

标签: c++ qt

我有一个小的Qt绘图应用程序,我正在启用/禁用基于" master"的小部件(组合/旋转框)。组合框。例如,假设主人是UIImage(contentsOfFile: imageFilePath)! ,根据combo1更改combo2中的条目,启用/禁用currentIndex(),并设置spin1的值如果选择spin1中的某个条目。但是,有更多的小部件,而不仅仅是这些小部件。

chat(以及之后)的小讨论之后,我使用了combo1Qt::QueuedConnection,但这并没有阻止重新启用的小部件发出信号何时重新启用。这导致我为所有重新启用的小部件执行了许多connect(),导致多个绘图,我想避免。就像他们现在一样,(几乎)所有小部件都在connect()内使用plot(),因此它会向一个插槽发送多个信号。

我的问题:是否有办法防止在重新启用小部件时发出信号?我可以让connect()使用一些plot()来检查绘图是否已执行并阻止相同类型的进一步操作,但这仍然会导致小部件发出信号并运行bool ,即使检查会阻止实际的绘图,但这似乎不太合适。我也希望避免运行plot()或类似的,因为这可能会比以前的修复速度更慢。

2 个答案:

答案 0 :(得分:1)

在每次连接之前使用disconnect以防止多个连接。始终允许断开未连接的插槽。

disconnect(spinbox1,...);
connect(spinbox1,...);

阻塞信号也是可能的,但我认为你想要第一个解决方案。

来自QtDocumentation:

bool QObject :: blockSignals(bool block) 如果block为真,则该对象发出的信号被阻塞(即,发出信号不会调用与其连接的任何信号)。如果block为false,则不会发生此类阻塞。

答案 1 :(得分:1)

a comment中已经提到的另一个选项是使用QObject::blockSignals

combo1->blockSignals(true);
// do what ever you need
combo1->blockSignals(false);

我发现它更易于使用和阅读。另外,在很多情况下,您根本不知道/不处理连接。