QT - QInputDialog 如何验证?

问题描述 投票:0回答:2

我想向我的 QInputDialog 添加某种类型的验证。我使用对话框的输入来创建文件系统路径。所以我想排除 @$#%^&*() 等字符,但保留 - 和 _。我正在考虑应用正则表达式模式,但我不确定工作流程。

如果不可能或者使用不同的东西是有意义的,我也对此持开放态度。

这是我目前正在使用的:

QString defaultText("whatever");
bool ok;
QString caseInput = QInputDialog::getText(this, tr("Input Text"), tr("New Text:"), QLineEdit::Normal, defaultText, &ok);

if (ok && !caseInput.isEmpty())
{
   // do stuff
}
c++ regex qt validation dialog
2个回答
7
投票

因此,如果您想完全控制它,您将需要制作自己的

QDialog
,为文本添加
QLabel
,并添加行编辑,设置
QValidator
,然后访问返回值.

像这样:

mydialog.h

#include <QDialog>
#include <QLineEdit>

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    MyDialog(QWidget *parent = 0);
    ~MyDialog();
    QString getNewValue();

signals:
    //void rejected();
    //void accepted();

public slots:


private:
    QLineEdit * le;
};

我的对话框.cpp

#include "mydialog.h"
#include <QDialogButtonBox>
#include <QRegExpValidator>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QLabel>

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
{
    le = 0;
    this->setAttribute(Qt::WA_QuitOnClose, false);

    QVBoxLayout * vbox = new QVBoxLayout;

    vbox->addWidget(new QLabel(tr("Type in your text:")));

    le = new QLineEdit();

    // le->setText(tr("Profile"));
    // le->selectAll();
    le->setPlaceholderText(tr("Profile"));

    vbox->addWidget(le);

    QRegExpValidator * v = new QRegExpValidator(QRegExp("[\\w\\d_ \\.]{24}"));
    le->setValidator(v);


    QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
        | QDialogButtonBox::Cancel);
    vbox->addWidget(buttonBox);
    this->setLayout(vbox);

     // connect(buttonBox, SIGNAL(accepted()), this, SIGNAL(accepted()));
     // connect(buttonBox, SIGNAL(rejected()), this, SIGNAL(rejected()));
}

MyDialog::~MyDialog()
{

}

QString MyDialog::getNewValue()
{
        return le->text();
}

使用示例:

MyDialog dialog;
if(dialog.exec() == QDialog::Accepted)
{
    QString retVal = dialog.getNewValue();
    qDebug() << "Dialog value:" << retVal;
}

实现几乎相同目标的另一种方法:

http://qt-project.org/doc/qt-4.8/qlineedit.html#inputMask-prop http://qt-project.org/doc/qt-4.8/widgets-lineedits.html

如果您想使用库存

getText
QInputDialog
您可以设置
InputMethodHint
字段:

http://qt-project.org/doc/qt-4.8/qinputdialog.html#getText

http://qt-project.org/doc/qt-4.8/qt.html#InputMethodHint-enum

但是

QRegExp
在我看来是最强大的。

以下是本课程中

QRegExp
的一些很好的示例:

http://qt-project.org/doc/qt-4.8/richtext-syntaxhighlighter-highlighter-cpp.html

 classFormat.setFontWeight(QFont::Bold);
 classFormat.setForeground(Qt::darkMagenta);
 rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b");
 rule.format = classFormat;
 highlightingRules.append(rule);

 singleLineCommentFormat.setForeground(Qt::red);
 rule.pattern = QRegExp("//[^\n]*");
 rule.format = singleLineCommentFormat;
 highlightingRules.append(rule);

 multiLineCommentFormat.setForeground(Qt::red);

 quotationFormat.setForeground(Qt::darkGreen);
 rule.pattern = QRegExp("\".*\"");
 rule.format = quotationFormat;
 highlightingRules.append(rule);

 functionFormat.setFontItalic(true);
 functionFormat.setForeground(Qt::blue);
 rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
 rule.format = functionFormat;
 highlightingRules.append(rule);

 commentStartExpression = QRegExp("/\\*");
 commentEndExpression = QRegExp("\\*/");

希望有帮助。


0
投票

验证

QInputDialog
中文本的最简单方法可能是使用
QRegularExpressionValidator
。应该应用于
QLineEdit
中的
QInputDialog
。但
QLineEdit
是私有的,不能直接使用。不过,有一个小技巧:使用
QObject::findChild()
。这是一个简单的例子:

QInputDialog dlg(this);
dlg.setWindowTitle(tr("Input Text"));
dlg.setLabelText(tr("New Text:"));
...
dlg.show(); // it's required to create internal QLineEdit
auto le = dlg.findChild<QLineEdit *>();
Q_ASSERT(le);
auto validator = new QRegularExpressionValidator(le);
validator->setRegularExpression(QRegularExpression("<your RegExp pattern>"));
le->setValidator(validator);
if (dlg.exec() == QDialog::Accepted) {
    const auto &text = dlg.textValue().trimmed();
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.