2016-09-17 85 views
2

QLineEdit有一個信號QLineEdit::editingFinished,當用戶完成編輯時(例如按下回車鍵),該信號發出。但是,如果設置了驗證器或輸入掩碼,則只有在輸入有效時纔會發出editingFinished帶QValidator的QLineEdit:無論輸入有效性如何,完成編輯完成?

但是,無論輸入的有效性如何,我如何才能完成編輯?我是否必須手動檢查輸入,返回,小部件失去焦點等?

原因是:我想創建一個自定義小部件,用於使用QDoubleValidator編輯數字。當用戶完成編輯並且輸入無效(範圍錯誤,文本爲空,...)時,我想將其重置爲某個有效的默認值。這樣的事情:

class NumberEdit: public QLineEdit 
{ 
public: 
    NumberEdit(double min, double max) 
    { 
     setValidator(new QDoubleValidator(min, max, 10)); 
     setText(QString::number(min)); 

     connect(this, /* this is the problem */, [this, min]() { 
      if(!hasAcceptableInput()) 
       setText(QString::number(min)); // Reset to valid number 
     }); 
    } 
}; 

回答

5

我不認爲你真的需要子類QLineEdit

改變QLineEdit值時,它不具有Acceptable輸入的乾淨方式,是重寫QValidatorfixup()提供實現。來自docs

fixup()被提供用於可以修復一些用戶錯誤的驗證器。 默認實現不做任何事情。例如,QLineEdit,如果用戶按下Enter(或Return)並且內容 當前不有效,則將 呼叫fixup()。這允許fixup()函數有機會 執行一些魔術來製作Invalid字符串Acceptable

由於您使用QDoubleValidator,你也可以繼承它併爲fixup()提供的實現,因爲它沒有一個,見here

類應該是這個樣子:

class MyDoubleValidator : public QDoubleValidator{ 
public: 
    explicit MyDoubleValidator(QObject* parent= nullptr) 
     :QDoubleValidator(parent){} 
    MyDoubleValidator(double bottom, double top, int decimals, QObject* parent=nullptr) 
     :QDoubleValidator(bottom, top, decimals, parent){} 

    virtual void fixup(QString& input)const override{ 
     input= QString::number(bottom(), 'f', decimals()); 
    } 
}; 

這樣的話,你可以用你的驗證與任何QLineEdit這樣的:

lineEdit->setValidator(new MyDoubleValidator(100, 200, 2, lineEdit)); 

需要注意的是,這種方式lineEdit會發出editingFinished()每次編輯後。因爲即使QLineEdit的內容不是Acceptable,我們的fixup()執行將始終爲修復的內容爲Acceptable