我有一个小的Qt绘图应用程序,我正在启用/禁用基于" master"的小部件(组合/旋转框)。组合框。例如,假设主人是UIImage(contentsOfFile: imageFilePath)!
,根据combo1
更改combo2
中的条目,启用/禁用currentIndex()
,并设置spin1
的值如果选择spin1
中的某个条目。但是,有更多的小部件,而不仅仅是这些小部件。
在chat(以及之后)的小讨论之后,我使用了combo1
和Qt::QueuedConnection
,但这并没有阻止重新启用的小部件发出信号何时重新启用。这导致我为所有重新启用的小部件执行了许多connect()
,导致多个绘图,我想避免。就像他们现在一样,(几乎)所有小部件都在connect()
内使用plot()
,因此它会向一个插槽发送多个信号。
我的问题:是否有办法防止在重新启用小部件时发出信号?我可以让connect()
使用一些plot()
来检查绘图是否已执行并阻止相同类型的进一步操作,但这仍然会导致小部件发出信号并运行bool
,即使检查会阻止实际的绘图,但这似乎不太合适。我也希望避免运行plot()
或类似的,因为这可能会比以前的修复速度更慢。
答案 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);
我发现它更易于使用和阅读。另外,在很多情况下,您根本不知道/不处理连接。