QLineEdit及類似控件無法正確發出editingFinished信號

QLineEdit結合正則表達式進行輸入匹配的時候有可能看似無法正確發出editingFinished信號,導致相應的槽函數不被觸發。

例如有下面這樣的正則表達式:

QRegExp dRx0_400_P1(“(400[.]{1,1}[0]{0,1})|([1-3]{0,1}[0-9]{1,2}[.]{1,1}[0-9]{0,1})”);

這是一個判斷輸入是否爲0~400之間帶有兩位小數的數字的正則表達式。連接editingFinished信號和槽,會發現,當你輸入類似“xx.x”之類數據時能夠正確觸發槽函數,但是輸入類似爲“xx”或“xx.”這樣的數據後。即便光標離開了QLineEdit,也不會觸發槽函數執行。

這是因爲,輸入的數據雖然看似”在0~400“之間,但是並沒有包含小數點和小數部分,因此,雖然在允許輸入範圍內,但是並不與正則表達式匹配,正則表達式返回false。可以理解爲:雖然光標離開了該QLineEdit,但是Qt認爲與正則表達式不匹配,就意味着用戶輸入不完整,因此不輸入編輯完畢(editingFinished)狀態,所以不觸發editingFinished信號。

若將正則表達式修改爲:

QRegExp dRx0_400_P1(“(400)|(400[.]{1,1}[0]{0,1})|([1-3]{0,1}[0-9]{1,2})|([1-3]{0,1}[0-9]{1,2}[.]{1,1}[0-9]{0,1})”);

則在輸入“xx.x”、“xx”或“xx.”這樣的數據後正則表達式都匹配,這種情況下,光標一旦離開QLineEdit,立刻發出editingFinished信號。

因此,editingFinished信號的觸發條件並不是光標離開QLineEdit,而是輸入的數據完整並且光標離開編輯區。也就是用戶真正的完成了輸入後纔會觸發該信號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章