C++ 检查QT输入的输入

C++ 检查QT输入的输入,c++,qt,C++,Qt,我有一个相当复杂的对话框,其中的输入是具有不同允许范围的数字。我想知道什么是保证QLineEdits具有正确输入值的最干净的模式 这样做的明显方式似乎是在用户单击OK按钮时检查输入值。我遇到的问题是,一些GUI控件依赖于其他输入的值。因此,在输入值错误的所有情况下,让我对控件的逻辑进行分支,代码似乎变得有点糟糕 对于这种情况有一个好的模式吗 我正在考虑将QLineEdit子类化,并使用focusOutEvent检查对话框的输入。如果输入不正确,我将默认值并触发逻辑。这将保证每个lineedit负

我有一个相当复杂的对话框,其中的输入是具有不同允许范围的数字。我想知道什么是保证QLineEdits具有正确输入值的最干净的模式

这样做的明显方式似乎是在用户单击OK按钮时检查输入值。我遇到的问题是,一些GUI控件依赖于其他输入的值。因此,在输入值错误的所有情况下,让我对控件的逻辑进行分支,代码似乎变得有点糟糕

对于这种情况有一个好的模式吗

我正在考虑将QLineEdit子类化,并使用focusOutEvent检查对话框的输入。如果输入不正确,我将默认值并触发逻辑。这将保证每个lineedit负责自己的验证。这样做有明显的陷阱吗


QValidator非常棒,问题在于它们的状态是中间状态。

使用
QLineEdit
提供的信号并构建一个小的插槽验证类。这将比直接对它们进行子类化更容易,并允许您进行更细粒度的控制。

使用
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对象生成的信号,并分别进行验证。与它交朋友可能是一个好主意。

您可以很好地使用子类化,因为只需设置到适当信号的连接就很容易了

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对象生成的信号,并分别进行验证。交朋友可能是一个好主意。

只是澄清一下-由于“输入是具有不同允许范围的数字”,那么您使用的是
QIntValidator
s,对吗?@TobySpeight我在任何地方都使用验证器,但例如,如果范围在10到20之间,用户仍然必须键入一位数字。这打破了逻辑。也许我不明白-如果没有一个数字作为部分输入,用户如何输入10到20之间的数字?或者,当行编辑发出
textdedited()
editingFinished()
信号时,您是否询问如何检查验证器?只是为了澄清-由于“输入是具有不同允许范围的数字”,那么您使用的是
QIntValidator
s,对吗?@TobySpeight我在任何地方都使用验证器,但例如,如果范围在10到20之间,用户仍然必须键入一个数字。这打破了逻辑。也许我不明白-如果没有一个数字作为部分输入,用户如何输入10到20之间的数字?或者您正在询问当行编辑发出
textEdit()
editingFinished()
信号时如何检查验证器?QLineEdit不提供焦点输出,我如何知道用户已完成编辑?它有一个
editingFinished
信号,如果按下回车键或行编辑失去焦点,将发出该信号。它不提供最终文本,但您可以使用
somelineedit->text()
QLineEdit不提供焦点输出来检索,我如何知道用户已完成编辑?它有一个
editingFinished
信号,如果按下return或行编辑失去焦点,将发出该信号。它不提供最终文本,但您可以使用
somelineedit->text()