做一個名稱校驗的函式,不能輸入特殊字元;
SlotTextChanged函式作用是判斷是否包含特殊字元,有的話,彈出提示,刪除特殊字元之後,在設定回去;發現輸入/之後,彈出模態提示,自動刪除後,在右側車牌號碼輸入框中輸入任意字元a會自動變成/a;是模態對話方塊打斷了變化訊息,當在右側輸入字元時,觸發了訊息,會把上次輸入的訊息在復現出來;
void EmptyTreeItem::SlotTextChanged(QString strText) { if (strText.size()>250) { WaringDialog diag("提示", "輸入名稱太長,請限制250個字元!"); diag.setPicType(-2); diag.exec(); strText = strText.left(250); ui.lineEditName->setText(strText); } if (strText.contains("\\")|| strText.contains("/")|| strText.contains(":")|| strText.contains("*") || strText.contains("?")|| strText.contains("\"")||strText.contains("<") || strText.contains(">") || strText.contains("|")) { WaringDialog diag("提示", "不能包含特殊字元:\\ : / * ? \" < > |"); diag.setPicType(-2); diag.exec(); strText=strText.replace("\\", ""); strText = strText.replace("/", ""); strText = strText.replace(":", ""); strText = strText.replace("*", ""); strText = strText.replace("?", ""); strText = strText.replace("\"", ""); strText = strText.replace("<", ""); strText = strText.replace(">", ""); strText = strText.replace("|", ""); ui.lineEditName->setText(strText); } }
發現是模態視窗WaringDialog 導致,所以解決辦法,就是用訊號槽的方式,SlotTextChanged函式發訊號,把模態提示放在變化之後彈出,避免阻塞輸入變化;
void EmptyTreeItem::SlotTextChanged(QString strText) { if (strText.size()>100) { strText = strText.left(100); ui.lineEditName->setText(strText); emit signalError(-2, "文字長度不能超過100"); } if (strText.contains("\\")|| strText.contains("/")|| strText.contains(":")|| strText.contains("*") || strText.contains("?")|| strText.contains("\"")||strText.contains("<") || strText.contains(">") || strText.contains("|")) { if (strText.contains("\\")) { strText = strText.remove("\\"); } if (strText.contains("/")) { strText = strText.remove("/"); } if (strText.contains(":")) { strText = strText.remove(":"); } if (strText.contains("*")) { strText = strText.remove("*"); } if (strText.contains("?")) { strText = strText.remove("?"); } if (strText.contains("\"")) { strText = strText.remove("\""); } if (strText.contains("<")) { strText = strText.remove("<"); } if (strText.contains(">")) { strText = strText.remove(">"); } if (strText.contains("|")) { strText = strText.remove("|"); } ui.lineEditName->setText(strText); emit signalError(-2, "不能包含特殊字元:\\ : / * ? \" < > |"); } }
訊號槽連線
connect(this, &EmptyTreeItem::signalError, this, &EmptyTreeItem::SlotError, Qt::QueuedConnection); }
定義
public slots: void SlotTextChanged(QString strText); void SlotError(int type, QString strContent); signals: void signalError(int type, QString strContent);