Qt4.8:如何使 LineEdit 始终以大写显示文本并且仍然具有 RegExp
Qt4.8: How to make LineEdit show text in uppercase always and still have a RegExp
我正在 Qt 4.8 上制作一个 gui 应用程序,其中包含一些 lineedits 让用户介绍一些信息。
通常您可以用 4 种不同的方式书写文本 "hello":
- 大写关闭,未按下 shift = "hello"
- 关闭大写,按下 shift = "HELLO"
- Caps ON,未按下 shift = "HELLO"
- Caps 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;
}
};
它工作完美,但我还需要此行编辑以仅接受字母、空格和数字(不接受任何符号)所以在设置 validatorA 之后我需要设置:
QRegExp rx("[A-Z\.\- 0-9]{0,30}");
QValidator *validator7 = new QRegExpValidator(rx, this);
myLineEdit->setValidator(validator7);
我注意到最后设计的验证器是决定行为的验证器,所以我不能同时使用两者。
如果我使用 validator7,它工作正常,但在第 4 种情况下失败:如果打开大写键并按下 shift,则不会写入任何内容,这就像用户没有打字,即使他正在敲击键盘。
所以我不知道如何设置两个验证器(我用其他不同的正则表达式进行了其他行编辑)。
那么...如何使我的行编辑遵循 RegExp 并始终以大写显示文本,而不管大写 + shift 的键盘组合如何?
非常感谢
使用验证器进行以下修改
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());
}
将 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());
}
适合我。
如果您只想在大写模式下显示字母 - 您可以将自定义字体设置为 lineedit:
QFont f = font();
f.setCapitalization(QFont::AllUppercase);
lineEdit->setFont(f);
但您仍然需要正则表达式来验证输入。
正则表达式不会与您的大写代码联系起来。
首先在验证器和 setValidator 中定义正则表达式,然后:
您可以简单地尝试以大写形式显示文本:
connect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(toUpper(QString));
并且在槽的定义中:
void MainWidget::toUpper(QString txt)
{
lineEdit.setText(txt.toUpper());
}
我正在 Qt 4.8 上制作一个 gui 应用程序,其中包含一些 lineedits 让用户介绍一些信息。
通常您可以用 4 种不同的方式书写文本 "hello":
- 大写关闭,未按下 shift = "hello"
- 关闭大写,按下 shift = "HELLO"
- Caps ON,未按下 shift = "HELLO"
- Caps 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;
}
};
它工作完美,但我还需要此行编辑以仅接受字母、空格和数字(不接受任何符号)所以在设置 validatorA 之后我需要设置:
QRegExp rx("[A-Z\.\- 0-9]{0,30}");
QValidator *validator7 = new QRegExpValidator(rx, this);
myLineEdit->setValidator(validator7);
我注意到最后设计的验证器是决定行为的验证器,所以我不能同时使用两者。 如果我使用 validator7,它工作正常,但在第 4 种情况下失败:如果打开大写键并按下 shift,则不会写入任何内容,这就像用户没有打字,即使他正在敲击键盘。 所以我不知道如何设置两个验证器(我用其他不同的正则表达式进行了其他行编辑)。
那么...如何使我的行编辑遵循 RegExp 并始终以大写显示文本,而不管大写 + shift 的键盘组合如何?
非常感谢
使用验证器进行以下修改
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());
}
将 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());
}
适合我。
如果您只想在大写模式下显示字母 - 您可以将自定义字体设置为 lineedit:
QFont f = font();
f.setCapitalization(QFont::AllUppercase);
lineEdit->setFont(f);
但您仍然需要正则表达式来验证输入。
正则表达式不会与您的大写代码联系起来。 首先在验证器和 setValidator 中定义正则表达式,然后: 您可以简单地尝试以大写形式显示文本:
connect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(toUpper(QString));
并且在槽的定义中:
void MainWidget::toUpper(QString txt)
{
lineEdit.setText(txt.toUpper());
}