QlineEdit輸入字元奇怪自動補全上一次字元而且交叉影響

一字千金發表於2024-03-19

做一個名稱校驗的函式,不能輸入特殊字元;

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);

  

相關文章