首页 文章

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

提问于
浏览
2

我正在Qt 4.8上制作一个gui应用程序,它包含一些线路,让用户介绍一些信息 .

通常你可以用4种不同的方式写“hello”:

  • 大写关闭,未按下班次= "hello"

  • 大写关闭,按下班次= "HELLO"

  • 上盖,未按下班次= "HELLO"

  • 大写ON,按下shift = "hello"

我想要的是,无论用户如何写,行编辑必须始终以大写字母显示(“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);

我注意到设计的最后一个验证器是决定行为的那个,所以我不能同时使用它们 . 如果我使用验证器7它工作正常,但它失败,案例编号为4:如果上限和按下移位,则没有写入任何内容,如果用户没有打字,即使他正在键入键盘也是如此 . 所以我不知道如何设置两个验证器(我还有其他不同的RegExp编辑线路) .

所以...我怎么能让我的lineedits跟随RegExp并且无论键盘的键盘组合移位,总是显示大写字母?

非常感谢

3 回答

  • 0

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

    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());
    }
    
  • 4

    用插槽连接 QLineEdit signal 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());
    }
    

    对我来说很好 .

  • 0

    如果您只想在大写模式下显示字母 - 您可以将自定义字体设置为lineedit:

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

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

相关问题