問了最后一個問題,關于掩碼以及如何將游標放在輸入文本的末尾,但沒有得到答案。試圖自己弄清楚,我意識到這個問題被問得很膚淺。所以。我試圖深入研究邏輯,查看不同站點上的示例。
ui->lineEdit_newClientPhone->setInputMask(" 7\\(999\\)999\\-99\\-99;_");

我最初的想法是什么 - 當您單擊滑鼠或獲得焦點時,回圈檢查該行并將游標放在第一個“__”的位置。這個想法很快就失敗了,只要我除錯了 ui->lineEdit->text() 行,并意識到該行只包含掩碼中的字符,沒有“填充符”(_)。結果,我得到了 7()-- 行。下一個想法是這樣的,經過一番折騰:我試圖提出一些復雜的數學計算,比如從字串末尾開始回圈,只要字串的一部分變得不等于 '(' 或 ') ' 或 '-' - 計算游標位置。(再次考慮字符“()-”)似乎甚至發生了一些事情:
if(event->type() == QEvent::MouseButtonPress){
int a = ui->lineEdit_newClientPhone->text().length();
switch(a){
case 6: case 7: case 8:
ui->lineEdit_newClientPhone->setCursorPosition(a - 3);
break;
case 9: case 10:
ui->lineEdit_newClientPhone->setCursorPosition(a - 2);
break;
case 11: case 12:
ui->lineEdit_newClientPhone->setCursorPosition(a - 1);
break;
case 13: case 14:
ui->lineEdit_newClientPhone->setCursorPosition(a);
break;
}
}
但是還是碰到了一些奇怪的行為,因為當你點擊滑鼠時,游標仍然放在滑鼠被戳的地方。盡管將上述開關放入按鈕中似乎可以正常作業。我什至嘗試過處理初等邏輯——當接收到焦點時,游標會接收到索引4,即它會移動到介紹所需的第一個位置——但這里的情況和上面描述的一樣。
也許我需要直接在線路上使用驗證器?現在有一個驗證器,這是它的代碼:
QRegularExpression numberRegex ("^\\ \\d{1,1}\\(\\d{3,3}\\)\\d{3,3}\\-\\d{2,2}\\-\\d{2,2}$");
QRegularExpressionValidator *numberValidator = new QRegularExpressionValidator (numberRegex);
但它用于檢查電話號碼的正確拼寫。在代碼中,我檢查輸入字串的有效性,然后執行必要的邏輯。
if(numberValidator->validate(a, b) == QValidator::Acceptable){
...
}
我能做什么?用面具創建正確填寫電話號碼的更有效且最重要的作業解決方案是什么?一般來說,沒有所有這些“裝飾” - 面具執行其功能,但就需要在程式中輸入大量數字而言,管理人員不會很高興需要將滑鼠對準所需位置用于撥號。
uj5u.com熱心網友回復:
根據Qt doc ,您正在呼叫 text() 方法:
設定輸入掩碼后, text() 方法回傳行編輯內容的修改副本,其中所有空白字符均已洗掉。可以使用 displayText() 讀取未修改的內容。
所以你應該做的就是從模板中找到符號 _ 并將游標設定到它的位置:
if(event->type() == QEvent::MouseButtonPress)
{
int pos = ui->lineEdit_newClientPhone->displayText()
.indexOf("_");
int last_pos = ui->lineEdit_newClientPhone->displayText().length();
ui->lineEdit_newClientPhone->setCursorPosition(
pos == -1 ? last_pos : pos
);
return true;
}
uj5u.com熱心網友回復:
我有時也會在使用基本小部件時遇到這種情況。它們非常適合一般用途,但對于特殊情況或當您確實需要快速/高效的重復輸入時,它們可能會很麻煩。如果您付出了合理的努力來讓默認小部件正常運行但仍然不能,有時最簡單的方法就是用火殺死它并繼續前進:
class CQLineEditPhoneClickEntry : public QLineEdit
{
Q_OBJECT
public:
explicit CQLineEditPhoneClickEntry( QWidget* pParent = 0 )
: QLineEdit( pParent )
{
setInputMask( " 7\\(999\\)999\\-99\\-99;_" );
}
virtual void mousePressEvent ( QMouseEvent* pEvent ) //override
{
QPoint pressPoint = pEvent->pos();
if( text().count() == 6 )
{
setCursorPosition(4);
return;
}
if( pressPoint.x() > 90 ) // in reality do something less hacky to support high dpi, etc.
{
setCursorPosition(4);
return;
}
QLineEdit::mousePressEvent( pEvent );
}
};
如果您對繼承有一個現代人的健康厭惡,那么可以通過安裝 Qt 風格的事件過濾器來完成類似的事情,而不需要太多努力。但希望這能讓您快速測驗這種方法是否適合您的需求,或者提供另一種探索途徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463644.html
