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,而是輸入的數據完整並且光標離開編輯區。也就是用戶真正的完成了輸入後纔會觸發該信號。