Qt4.8:如何使 LineEdit 始终以大写形式显示文本并且仍然具有 RegExp

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

我正在 Qt 4.8 上制作一个 gui 应用程序,其中包含一些行编辑,让用户介绍一些信息。

通常您可以用 4 种不同的方式书写文字“hello”:

  1. 大写关闭,未按下 Shift 键 =“你好”
  2. 大写关闭,按下 Shift 键 =“HELLO”
  3. 大写打开,未按下 Shift =“HELLO”
  4. 大写打开,按下 Shift =“你好”

我想要的是,无论用户如何书写,行编辑都必须始终以大写形式显示(“HELLO”)。

我现在用的是:

Myclass.cpp:

auto validatorA = new MyValidator(parent);
myLineEdit->setValidator(validatorA);

Myclass.h(包含之后、

class MyClass: ...
之前)

 class MyValidator: public QValidator {
 public:
    MyValidator(QObject* parent=nullptr): QValidator(parent) {}
    State validate(QString& input, int&) const override {
      input = input.toUpper();
       return QValidator::Acceptable;
    }
 };

它工作完美,但我还需要此行编辑以仅接受字母、空格和数字(不接受符号),因此在设置验证器A后我需要设置:

QRegExp rx("[A-Z\\.\\- 0-9]{0,30}");
QValidator *validator7 = new QRegExpValidator(rx, this);
myLineEdit->setValidator(validator7);

我注意到设计的最后一个验证器是决定行为的验证器,所以我不能同时使用两者。 如果我使用 validator7,它工作正常,但在第 4 种情况下失败:如果打开大写字母并按 Shift 键,则不会写入任何内容,就像用户即使敲击键盘也没有打字一样。 所以我不知道如何设置两个验证器(我使用其他不同的正则表达式进行了其他行编辑)。

那么...如何使我的行编辑遵循 RegExp 并始终以大写字母显示文本,无论 caps+shift 的键盘组合如何?

非常感谢你

regex qt qt4 qt4.8
4个回答
5
投票

使用验证器进行输入并进行以下修改

QRegExp rx("[a-z-A-Z\\.\\- 0-9]{0,30}");
QValidator *validator7 = new QRegExpValidator(rx, this);
ui->lineEdit->setValidator(validator7);

对于大写字母,请使用 LineEdit 中的

textEdited
信号,如下所示

void MainWindow::on_lineEdit_textEdited(const QString &arg1)
{
    ui->lineEdit->setText(arg1.toUpper());
}

2
投票

如果您只想在大写模式下显示字母 - 您可以使用以下方法将自定义字体设置为行编辑:

QFont f = font();
f.setCapitalization(QFont::AllUppercase);
lineEdit->setFont(f);

但是您仍然需要正则表达式来验证输入。


1
投票

正则表达式不会与您的大写代码联系。 首先在验证器和 setValidator 中定义正则表达式,然后: 您可以简单地尝试以大写形式显示文本:

connect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(toUpper(QString)));

在槽的定义中:

void MainWidget::toUpper(QString txt)
{
    lineEdit.setText(txt.toUpper());
}

0
投票

QLineEdit
信号
textChanged()
与插槽连接:

connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(toUpper(const QString &)));

然后这样做:

void MainWindow::toUpper(const QString &text)
{
    QLineEdit *le = qobject_cast<QLineEdit *>(sender());
    if (!le)
        return;
    le->setText(text.toUpper());
}

对我来说效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.