我想向我的 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
}
因此,如果您想完全控制它,您将需要制作自己的
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("\\*/");
希望有帮助。
验证
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();
...
}