2015-12-15 236 views
0

我有一個相當複雜的對話框,輸入是帶有不同允許範圍的數字。我想知道什麼是最乾淨的模式,以保證我的QLineEdits具有正確的輸入值。檢查QT輸入的輸入

這樣做的顯而易見的方式似乎檢查用戶單擊確定按鈕時的輸入值。我遇到的問題是,某些GUI控件取決於其他輸入的值。因此,通過讓我爲所有輸入值錯誤的情況分支控件的邏輯,代碼似乎變得有點令人討厭。

這種情況有沒有好的模式?

我在考慮繼承QLineEdit並使用focusOutEvent檢查對話框的輸入。如果輸入不正確,我會默認值並觸發邏輯。這將保證每個lineedit都負責它自己的驗證。這樣做是否有明顯的缺陷?

QValidators真棒,問題是當他們的狀態是中間的。

+0

只是爲了澄清 - 因爲_「的輸入是具有不同的允許範圍的數字」_,那麼你正在使用'QIntValidator'爲那些,對吧? –

+0

@TobySpeight我在任何地方都使用驗證器,但是例如如果範圍在10到20之間,用戶仍然需要輸入一個數字。這打破了邏輯。 – Mac

+0

也許我不明白 - 用戶如何輸入10到20之間沒有一位數字作爲部分輸入?或者你在問行編輯發出'editEdited()''editingFinished()'信號時如何檢查驗證器? –

回答

3

使用QLineEdit提供的信號並構建一個小的驗證類的插槽。它比直接子類更容易,並且允許你更細粒度的控制。

+0

QLineEdit不提供FocusOut,我將如何知道用戶已完成編輯? – Mac

+0

它有一個'editingFinished'信號,如果按下返回或者線條編輯失去焦點,就會發出這個信號。它沒有提供最終的文本,但你可以用'somelineedit-> text()'來檢索 –

1

您可能很好地處理了子類QLineEdit,因爲只需建立與相應信號的連接即可。

class foo : public QLineEdit 
{ 
Q_OBJECT 

// ... staff here 

private: 

void signal_control() 
{ 
connect(this,SIGNAL(textChanged(const QString &)),this, SLOT(text_validate(const QString &))); 

private slots: 

void text_validate(const QString &) 
{ 
// validate your text here 
} 

}; 

您也可以建立一個不同的類,只是聽從QLineEdit的物體所產生的信號,並分別驗證。結交這可能是一個好主意。