Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将鼠标事件传递到QT中的小部件_C++_Qt - Fatal编程技术网

C++ 如何将鼠标事件传递到QT中的小部件

C++ 如何将鼠标事件传递到QT中的小部件,c++,qt,C++,Qt,考虑这种情况: 对于小部件上的按钮:如果在小部件(包含按钮)通过显式调用hide()隐藏后,按钮的clicked()插槽有可能被传递(处理) 例如,假设有一个计时器,在它的timeout()插槽中,widget.hide()被调用。巧合的是,用户在启动的同时单击按钮 问题是:按钮的clicked()插槽是否有可能在计时器的timeout()插槽(隐藏包含按钮的小部件)后被调用?否,主线程与GUI操作同步,因此您无法更改主线程中对象的可见性(就像你的QPushButton)正是在用户点击它的同时。

考虑这种情况:

对于小部件上的按钮:如果在小部件(包含按钮)通过显式调用
hide()
隐藏后,按钮的
clicked()
插槽有可能被传递(处理)

例如,假设有一个计时器,在它的
timeout()
插槽中,
widget.hide()
被调用。巧合的是,用户在启动的同时单击按钮


问题是:按钮的
clicked()
插槽是否有可能在计时器的
timeout()
插槽(隐藏包含按钮的小部件)后被调用?

否,主线程与GUI操作同步,因此您无法更改主线程中对象的可见性(就像你的
QPushButton
)正是在用户点击它的同时。此外,除非你在一个具有不同事件循环的多线程应用程序上,否则你的
QTimer
也将在主线程中处理,因此它与UI是同步的。简而言之,你可能会获得毫秒级的并发(在隐藏之前立即单击),但不是实际的并行性


如果你关心这一点,也许你可以在实际处理点击之前设置一个小的延迟,只是为了检查按钮是否被点击但立即隐藏。在这种情况下,你可以忽略用户输入,但这会让人困惑。另一个选项是延迟隐藏按钮,如果它被点击,用户不会得到错误的视觉反馈k、

谢谢@cbuchart,我想我知道背后的机制:简言之,默认情况下,鼠标单击事件只传递到顶部可见的小部件。在我的情况下,在
timeout()
中的
hide()
之后,小部件变得不可见(尽管可能仍然可以看到,因为它尚未重新绘制),因此鼠标事件忽略此小部件(及其子部件)并将其传递到其后面的小部件(以检查其可见性和其他状态)等等。没错,鼠标处理事件发生在底层(实际)窗口小部件的布局,当前屏幕上的呈现根本不相关,可能已经过时。有时我发现
qApp->processEvents()
很有用,以便刷新挂起的事件(包括重新绘制)并尽可能更新UI。是的,
qApp->processEvents()
似乎是处理所有挂起事件(包括绘制事件)的条目。但是,我从来没有这样使用过它,因为我认为它会破坏内置事件循环,并可能导致不可预测的程序流,例如一个按钮的
单击()
插槽可能嵌套在另一个按钮的插槽中。