5

我想向我的 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
}
4

1 回答 1

7

因此,如果您想完全控制它,您将需要制作自己的QDialogQLabel为文本添加 a ,然后添加一行编辑,设置 a 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;
};

mydialog.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("\\*/");

希望有帮助。

于 2013-11-09T17:07:38.453 回答