Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pakulo от Июня 24, 2007, 08:57



Название: Нужна подсказка
Отправлено: pakulo от Июня 24, 2007, 08:57
У меня есть свой QLabel скажем
Когда я добавляю туда текст, можно написать так "&Label"
я регистрирую
Id = grabShortcut(QKeySequence::mnemonic(text));
потом мне нужно удалить символ & из текста, удаляю так
text.remove("&");
Но а если пользователь ввел && то ничего удалять понятное дело не нужно.
Как грамотно и красиво реализовать данный алгоритм?


Название: Нужна подсказка
Отправлено: Racheengel от Июня 24, 2007, 10:06
не понял... т.е. && оставлять, а один & удалять? Зачем так делать?


Название: Нужна подсказка
Отправлено: pakulo от Июня 24, 2007, 11:20
Ну так обычно происходит когда \\ слеша например, остается только \...
А если был один \, то он идет как спец символ, и если после еще и n \n, то это будет переход на новую строку...
Так же и тут... если два &&, то оно выводится просто как текст одна &, если одна &, то она вообще не выводится и идет как спец символ который обозначает что буква после & будет использована в Shortcut


Название: Нужна подсказка
Отправлено: Racheengel от Июня 24, 2007, 11:51
ну тогда тебе наверно регекспы помогут....


Название: Нужна подсказка
Отправлено: pakulo от Июня 24, 2007, 12:33
А можно примерчик?


Название: Нужна подсказка
Отправлено: Racheengel от Июня 24, 2007, 14:44
впрочем, самый простой вариант наверно такой:

void makeStr(QString &str)
{
   str.replace("&&", "^^");
   str.replace("&", "");
   str.replace("^^", "&&");
}

str - это строка, которую надо очистить от &
"^^" - любая подстрока, которая ну уж точно не должна быть в str.


Название: Нужна подсказка
Отправлено: Emc от Июня 24, 2007, 17:32
str.remove(QRegExp("\\&{1,1}"));


Название: Нужна подсказка
Отправлено: pakulo от Июня 25, 2007, 18:28
Racheengel, так понятное дело можно сделать, но это не эффективно и не красиво ))... выходит шо ты строку будешь трижды проходить...

Emc, к сожалению удаляет все символы, а мне нужно что бы && замени на &, а если одна &, то удалить

буду разбираться с регулярными выражениями...

добавлено спустя 13 минут:

 Я сделал так
str.remove(QRegExp("&(?!&)"));
вроде работает...
кто что может сказать по этому поводу? :)


Название: Нужна подсказка
Отправлено: Racheengel от Июня 25, 2007, 20:48
работает - значит хорошо :)
но если главный параметр - это эффективность, то тогда надо просто циклами с проверкой и копированием делать.
как в С.


Название: Нужна подсказка
Отправлено: pakulo от Июня 25, 2007, 21:33
а что эффективнее
str.remove(QRegExp("&(?!&)"));
или то что ты предложил в первых сообщениях? ))


Название: Нужна подсказка
Отправлено: Racheengel от Июня 25, 2007, 22:03
честно тебе скажу - не проверял.
но сугубо интуитивно, наверно регекспы будут все таки помедленнее - т.к. там все на движке завязано, в то время как поиск-замена символов в строке - задача довольно тривиальная.
если судить по эффективности - вариант с циклом должен быть самым быстрым (хотя и самым длинным по коду).


Название: Нужна подсказка
Отправлено: pakulo от Июня 27, 2007, 10:32
Ок, спасибо буду уже думать!

добавлено спустя 51 секунду:

 Напишу скорее всего свой метод, и буду через цикл удалять... ))


Название: Re: Нужна подсказка
Отправлено: Sokoloff от Января 11, 2008, 11:52
А в чем проблема с циклом? Бежим в цикле и если текущий символ - амперсанд удаляем его и перепрыгиваем через следующий. Тогда получаться такие замены:
& - удалиться
&& - &
&&& - &
&&&& -&&
и.т.д.
Вроде то что хотели.