2015-12-15 192 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的物体所产生的信号,并分别验证。结交这可能是一个好主意。