1. 程式人生 > 實用技巧 >Qt 鍵盤事件

Qt 鍵盤事件

我們需要對介面中的TextEdit文字框輸入進行限制,讓其無法輸入除十六進位制所需的字元和其他幾個必要字元外,無法輸入其他的字元。而這個功能LineEdit是可以通過正則表示式做到的,具體程式碼如下圖:

wKiom1XOyi6CjQp5AACw7ob-s3w848.jpg

我們想讓TextEdit也能實現這個功能,我們首先想到的是模仿LineEdit中的Validator函式,讓TextEdit也有Validator函式,我找到了qlineedit.cpp檔案,發現其內部結構太過複雜,我暫時的能力還無法實現這個程式碼的模仿,同時也覺得既然TextEdit沒有Validator函式肯定有其原因,盲目移植可能會造成很多不必要的問題,所以這個想法就在此停止,開始考慮其他方法去實現。

接下來,我想到的是既然我們需要對TextEdit文字框中的鍵盤事件進行處理,而直接在qtextedit.cpp裡面修改又不好,於是我就想到了自己重新過載一個函式,而這個函式是繼承QTextEdit的,那麼在這個過載的函式中新增對鍵盤事件進行處理的函式是否可以實呢?這裡面遇到了很多問題,現在我詳細記錄一下這裡的思考過程。過載TextEdit函式內容如下圖:

wKioL1XOy7WRWDJhAAFaaiS1KUk199.jpg

wKiom1XOya6gzYH1AAI-RZM9iLU767.jpg

wKioL1XOy7aRzS2pAADefZPkoAo224.jpg

首先遇到的過載的方法不太會,我查了C++書中的過載方法,重新看了Qt的入門書籍,再加上向別人請教,終於寫出了過載函式的雛形;然後遇到就是我用程式碼建立的edit文字框是區域性變數,為了使edit可以在textedit.cpp中使用,我編寫了一個頭檔案用來宣告這個變數,同時重新定義這個

edit區域性變數使其變成全域性變數。

全域性變數定義語句:TextEdit*edit;

宣告語句:externTextEdit*edit;

在對鍵盤事件處理的函式中我採用的是傳送訊號,在主視窗接收這個訊號轉到槽中,使輸入的數在TextEdit中顯示,這裡遇到了一個問題,我可以在ui->TextEdit中顯示所需要的數,達到限制不需要的數顯示的效果,可是卻無法再edit文字框中顯示。我猜測這是因為我傳送訊號之後馬上就執行槽函式,而鍵盤事件函式沒有執行完造成的衝突,於是我查閱了相關資料去驗證我的猜測,我重新定義connect實現鍵盤事件函式執行完成後再執行槽函式,可是最後還是衝突,無法顯示。於是這個方法只好暫時擱淺。

(補)在完成事件過濾之後,我又重新考慮這個方案,發現了一句特別好用的語句QTextEdit::keyPressEvent(event);voidTextEdit::keyPressEvent(QKeyEvent*event)函式中新增上述語句,讓程式重新回到預設事件的處理函式中去,就可以完成edit的顯示了。

最後我無意間看到了事件過濾這個函式,於是我採用事件過濾函式要編寫程式碼實現過濾不需要的字元來起到限制的效果。最後成功的結果了這個問題,實現了對TextEdit文字框輸入的字元進行限制的效果。詳細程式碼如下圖:

wKioL1XOy82ycLdQAANcKZEGu1g033.jpg

這個問題的解決過程,使我學到遇到問題,首先分析問題,然後針對問題,想出幾種解決方法,對這方法一一實踐,找出最好的解決方法。在寫程式碼過程中,要仔細分析出錯原因,我應該怎麼改才能解決這個錯誤,想到可能原因之後要去實踐,用實踐來檢驗是否可行。


轉載於:https://blog.51cto.com/canyueweizhui/1684834