2016-10-11 24 views
2

我有一個QComboBox相關聯到其上的驗證器:如何檢查小部件值是否爲「可接受」?

QComboBox* cb = new QComboBox; 
// ... 
cb->setValidator(new QDoubleValidator(0.0, 100.0, 2, this)); 

該插件被連接到當所輸入的值被改變(currentTextChanged()),其被執行的槽。

connect(cb, SIGNAL(currentTextChanged(QString)), 
     this, SLOT(onTextChanged(QString))); 

在這種配置中,當onTextChanged()驗證器返回AcceptableIntermediate被執行。只有當輸入的值確實有效時,我如何才能執行插槽(Acceptable)。或者,我如何檢查onTextChanged()插槽中的驗證狀態? (奇怪的是,我注意到,cb->validator()似乎總是返回nullptr。)

+0

「我已經注意到le-> validator()參見ms總是返回nullptr「le或cb?您也可以將驗證器指針保存在成員變量中。 –

+0

@FrankOsterfeld問題已修復! – mimo

+0

嘗試將'QDoubleValidator'的父項設置爲'QComboBox cb'而不是'this'。 – RedX

回答

1

安裝一個新的驗證您的組合框:

QComboBox* cb = new QComboBox; 
QDoubleValidator* validator = new QDoubleValidator(0.0, 100.0, 2, this); 
cb->setValidator(validator); 

連接你的信號/插槽:

connect(cb, SIGNAL(currentTextChanged(QString)), 
     this, SLOT(onTextChanged(QString))); 

在插槽,通過檢查當前文本是否有效開始:

int pos = cb->currentIndex(); 
const QDoubleValidator* validator = qobject_cast<const QDoubleValidator*>(cb->validator()); 
QValidator::State state = validator->validate(txt, pos); 
if (state != QValidator::Acceptable) 
    return; 
+0

有沒有辦法從QComboBox實例訪問驗證器? – mimo

+0

是的,http://doc.qt.io/qt-4.8/qcombobox.html#validator查看最後更改 – mohabouje

+0

但是,正如我在問題中提到的那樣,validator()返回一個空指針。事實上,它不僅在插槽中,而且在我使用cb-> setValidator(新QDoubleValidator(0.0,100.0,2,this))設置驗證器後立即檢查它;''。 – mimo