我有一個QPushButton,以及連接到它的「按下」信號那樣的槽:調用兩次Qt的按鈕插槽,儘管禁用
connect(&m_oBtnSnapshot, SIGNAL(pressed()), this,
SLOT(SnapshotClicked()));
插槽爲這樣的實現:
void
GUI::SnapshotClicked()
{
m_oBtnSnapshot.blockSignals(true);
m_oBtnSnapshot.setDisabled(true);
m_oBtnBenchmark.repaint();
m_oBtnBenchmark.update();
emit(DoSnapshotWork());
m_oBtnSnapshot.setDisabled(false);
m_oBtnSnapshot.blockSignals(false);
}
正如你所看到的,當我點擊它時,我禁用了按鈕,並在所有事情完成時重新啓用它。 讓我們假設DoSnapshotWork()函數需要5秒鐘...雖然這5秒鐘按鈕被禁用,但如果我點擊它,SnapshotClicked()插槽將被調用。爲什麼禁用按鈕不會阻止我點擊它?
我已經嘗試斷開信號進入插槽並重新連接後,但沒有任何幫助。
爲什麼?推動和點擊之間的區別?我完全像你說的那樣,但是當按鈕被禁用時,我仍然能夠「點擊」它。它被禁用,但發出DoSnapshotWork()信號。 – Hafnernuss 2013-03-28 08:54:50
我現在想通了。不知何故,當將DoSnapshotWork()插槽連接到其他線程(GUI所在的位置,按鈕被按下)時,我錯過了Qt :: QueuedConnection標誌。我不知道爲什麼,但這不知何故導致兩次插槽。感謝提示! – Hafnernuss 2013-03-28 09:04:05
當您在按鈕區域內按下鼠標左鍵時(並且每次以後都會進入此區域,而不釋放鼠標按鍵),會按下()按鈕。當在按鈕區域內釋放鼠標左鍵時,按下左鍵後,點擊()會被省略。你可以編寫一個簡單的應用程序來感受不同之處。 P.S:非常歡迎:) – Amartel 2013-03-28 09:11:50