2016-06-27 3 views
0

Я новичок в Qt. Я хочу проверить входное значение QLineEdit: если вход начинается с пробела, поверните цвет шрифта в черный, иначе сделайте его красным. Но это не работает.Qt QRegExp с пробелами не работает

Вот код:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 


} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    QRegExp regexp("^\s*"); 

    if(!regexp.exactMatch(arg1)) 
    { 
     ui->lineEdit->setStyleSheet("color:red"); 
    } else 

    { 
     ui->lineEdit->setStyleSheet("color:black"); 
    } 

} 

Так что, когда я запускаю этот код и начать с пространством, оно становится красным, я не могу понять, почему это произошло.

ОБНОВЛЕНО ВОПРОС

Вот что я думаю: Если я хочу, чтобы пометить красным цветом, когда вход не цифра, то RegExp хотел бы это:

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    QRegExp regexp("^[0-9]*"); 

    if(regexp.exactMatch(arg1)) { 
     ui->lineEdit->setStyleSheet("color:black");//if the input is digits,black 
    } else { 
     ui->lineEdit->setStyleSheet("color:red");//not digits,red 
    } 
} 

И это работает, как я разыскивается . Но когда я добавляю \s в RegExp (QRegExp regexp("^\s[0-9]*")), цифры начинаются с пробелов или чистых цифр, которые становятся красными. Почему это?

+0

Прежде всего, вы можете использовать \ S (обратите внимание на крышку), чтобы соответствовать символу. Кроме того, проверьте двойное отрицание в своей логике. Предположим, что 'A' is 'arg1 начинается с пробела'. Затем ваш регулярный поиск ищет совпадение «не A». И тогда вы отменяете логическое значение точного соответствия (т. Е. «!»), Что означает, что вы проверяете «не A», другими словами, для «A». Поэтому текущая логика ставит строки, начинающиеся с пробела в красном, в противном случае - в черном. – Bettorun

+0

Спасибо за вашу помощь. Но я думаю, что это не так, я изменил код на: QRegExp regexp ("^ \ s *"); если (regexp.exactMatch (arg1)) { ui-> lineEdit-> setStyleSheet ("цвет: черный"); } else { ui-> lineEdit-> setStyleSheet ("цвет: красный"); } все еще не работает, когда ввод представляет собой несколько пробелов "", например, цвет шрифта lineedit по-прежнему остается красным. –

+0

Я вижу, где я ошибся, я должен использовать «\\ s» insteal из «\ s», спасибо за вашу помощь! –

ответ

1

Есть пара проблем с вашим кодом.
Прежде всего, использование regexp для решения этой задачи является излишним. Вам просто нужно проверить, является ли первый символ строки пробелом. Если вам нужно проверить равенство на простой символ пробела (0x20), вы можете использовать функцию QString::startsWith: arg1.startsWith(' '). Или, если вам нужно принять во внимание любые пробельные символ, который вы можете использовать QChar::isSpace метод:

bool stringDoesStartWithWhitespace = false; 
if (!arg1.isEmpty()) { 
    stringDoesStartWithWhitespace = arg1[0].isSpace(); 
} 

Это приводит нас к этим вариантам кода:

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    if (arg1.startsWith(' ')) { 
     ui->lineEdit->setStyleSheet("color:black"); 
    } else { 
     ui->lineEdit->setStyleSheet("color:red"); 
    } 
} 

или:

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    bool stringDoesStartWithWhitespace = false; 
    if (!arg1.isEmpty()) { 
     stringDoesStartWithWhitespace = arg1[0].isSpace(); 
    } 

    if (stringDoesStartWithWhitespace) { 
     ui->lineEdit->setStyleSheet("color:black"); 
    } else { 
     ui->lineEdit->setStyleSheet("color:red"); 
    } 
} 

Теперь давайте посмотрим на регулярное выражение (если вам действительно необходимо использовать его). Вы должны победить обратную косую черту, чтобы это можно было рассматривать как часть регулярного выражения, а не как часть escape-последовательности (\s). Вы можете прочитать here о escape-последовательностях.
Кроме того, как я понял, вам нужно сделать черный цвет переднего плана, если вход начинается с хотя бы одного пробела. В этом случае вы должны использовать символ + вместо * (E+ для сопоставления одного или нескольких вхождений E). Вы можете прочитать о кванторах here.
Во-вторых, QRegExp используя. QRegExp::exactMatch страница говорит, что эта функция

Возвращает true, если строка соответствуют точно этому регулярному выражению; в противном случае возвращается false.

В вашем случае вам просто нужно проверить, соответствует ли начало значению QTextEdit регулярным выражением. Вы должны использовать функцию QRegExp::indexIn.
В результате, ваш код будет выглядеть примерно так:

void MainWindow::on_lineEdit_textChanged(const QString &arg1) 
{ 
    QRegExp regexp("^\\s+"); 

    if (regexp.indexIn(arg1) > -1) { //we do have the whitespace in the beginning of the string 
     ui->lineEdit->setStyleSheet("color:black"); 
    } else { 
     ui->lineEdit->setStyleSheet("color:red"); 
    } 
} 
+0

Я вижу, где я могу ошибаться, поэтому, если я использую «\ s» в QRegExp, код найдет совпадение для «s», и мне действительно нужно использовать «\\ s», и если я хочу to найти цифры Я должен использовать «\\ d» вместо «\ d», правильно? Спасибо за вашу помощь. –

+0

Это не так просто. '\ s' в строковом литерале, рассматриваемом как неизвестная escape-последовательность. Как указано в стандарте C++, «escape-последовательности , в которых символ, следующий за обратным слэшем, не указан в таблице 6, условно поддерживается с семантикой, определенной реализацией». Это значит, что результат литерала будет зависеть от компилятора. Например, VC++ интерпретирует '\ s' в строковом литерале как простой символ 's'. В общем, лучше не использовать неизвестные escape-последовательности. –

+0

Спасибо за подсказку, как вы упомянули, я считаю, что регулярное выражение действительно имеет некоторые отличия на других языках. –

Смежные вопросы