Russian Qt Forum
Ноябрь 23, 2024, 08:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 14 15 [16] 17 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 160875 раз)
Spark
Гость
« Ответ #225 : Август 10, 2013, 04:47 »

m_ax Сам так делать не буду и другим изучающим не советую.
Во первых, я достаточно ясно представляю, что мне надо.
Во вторых (не люблю аналогии, поскольку их коверкают), если вам необходимо построить дом и в вашем распоряжении весь арсенал инструментов, но пользоваться вы можете только молотком, то сколько бы вы в окно не смотрели и не представляли как должен выглядеть новый дом, легче от этого не станет. Легче станет только при строительстве второго дома и тем более третьего...
В третьих, советы я слушаю и по мере осознания как они работают и их преимуществ, применяю (можно было все таки это заметить).

Но вы точно подметили на счет перспектив моего модуля и, что я собираюсь делать Улыбающийся. Пока проблем не вижу. Да возможно придется переделывать, но я уже умею пользоваться не только молотком Улыбающийся, но все таки не достаточно, что бы расслабиться, заглянуть в окно и идеи реализации шли бы как из рога изобилия. Пока, что только хотелки могут разрастись, но я их итак знаю. В общем самый действенный способ в моей ситуации - делать, ошибаться, спрашивать, исправлять, набираться опыта...
Записан
Spark
Гость
« Ответ #226 : Август 10, 2013, 06:34 »

QString::fromUtf16()
На самом деле это первое с чего начал решать этот вопрос. К сожалению не разобрался.
Так работает:
Код
C++ (Qt)
   QFile file( textFilename );
   if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
   {
       QByteArray a = file.readAll();
       QString originalText(QString::fromUtf8(a));
 
   qDebug() << "Reade Data: " << tm.elapsed();
   tm.start();
 
   textory.clear();
   textory.enableAdd( true );
 
   // ОСТАВЛЯЕМ: ВЕСЬ ТЕКСТ/АНГЛИЙСКИЙ/РУССКИЙ
   const QString mask[4] = {
       QString("[\\s\\W\\d_]+"),
       QString("[^a-z]+"),
       QString::fromUtf8("[^а-яё]+"),
       QString("\n"),
   };
   QRegExp rexp(mask[pref.langStatSort]);
   rexp.setMinimal(true);
   listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
 
   file.close();
   }

Решение в лоб уже не работает:
Код
C++ (Qt)
       QByteArray a = file.readAll();
       QString originalText(QString::fromUtf16(a));
Здесь уже на этапе компиляции ругается.
Понимаю, что то не так с записью. Но не знаю - что.
Записан
Spark
Гость
« Ответ #227 : Август 10, 2013, 06:48 »

Это работает, но опять же с текстом UTF-8:
Код
C++ (Qt)
       QByteArray a = file.readAll();
       QTextCodec *codec = QTextCodec::codecForName("UTF-8");
       QString originalText = codec->toUnicode(a);
Этот код уже отказывается правильно работать:
Код
C++ (Qt)
       QByteArray a = file.readAll();
       QTextCodec *codec = QTextCodec::codecForName("UTF-16");
       QString originalText = codec->toUnicode(a);
Правда в этот раз компилятор не ругается. Но программа выдает китайские иероглифы, либо вообще ничего не дает. Но можно предположить, чего ей не хватает.
На самом деле, даже если бы, что и вышло с этими двумя вариантами, то полагаю они не универсальны.
« Последнее редактирование: Август 10, 2013, 08:14 от Spark » Записан
Spark
Гость
« Ответ #228 : Август 10, 2013, 07:39 »

Желаемый результат удалось получить следующим образом и в этом случае без разницы какой текст на входе:
Код
C++ (Qt)
   QFile file( textFilename );
   if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
   {      
       // РАБОТАЕТ
       QTextStream stream(&file);
       stream.setCodec("UTF-8");
       QString originalText(stream.readAll());
       stream.flush();
       file.close();
 
       textory.clear();
       textory.enableAdd( true );
 
       // ОСТАВЛЯЕМ: ВЕСЬ ТЕКСТ/АНГЛИЙСКИЙ/РУССКИЙ
       const QString mask[4] = {
           QString("[\\s\\W\\d_]+"),
           QString("[^a-z]+"),
           QString::fromUtf8("[^а-яё]+"),
           QString("\n"),
       };
       QRegExp rexp(mask[pref.langStatSort]);
       rexp.setMinimal(true);
       listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
   }

Попутный вопрос. Есть принципиальное значение где закрывать файл (file.close())?
Может следует так:
Код
C++ (Qt)
   QFile file( textFilename );
   if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
   {      
       // РАБОТАЕТ
       QTextStream stream(&file);
       stream.setCodec("UTF-8");
       QString originalText(stream.readAll());
 
       textory.clear();
       textory.enableAdd( true );
 
       // ОСТАВЛЯЕМ: ВЕСЬ ТЕКСТ/АНГЛИЙСКИЙ/РУССКИЙ
       const QString mask[4] = {
           QString("[\\s\\W\\d_]+"),
           QString("[^a-z]+"),
           QString::fromUtf8("[^а-яё]+"),
           QString("\n"),
       };
       QRegExp rexp(mask[pref.langStatSort]);
       rexp.setMinimal(true);
       listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
 
       stream.flush();
       file.close();
   }
« Последнее редактирование: Август 10, 2013, 08:20 от Spark » Записан
Spark
Гость
« Ответ #229 : Август 10, 2013, 07:47 »

Эх, kambala, здесь ИМХО, проблема гораздо глубже.. Все эти fromUtf16/8 и т.д. всего лишь частности.. в которых Spark копается уже больше месяца(..
За эти больше месяца сделано и работают на публику(пока, что узкий круг знакомых) три модуля, аналогов которым нет. Не так уж и плохо для новичка. Это не хвастовство, это констатация фактов.
Не без помощи профи. И за помощь огромнейшее спасибо!
« Последнее редактирование: Август 10, 2013, 07:52 от Spark » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #230 : Август 10, 2013, 10:33 »

Но вы точно подметили на счет перспектив моего модуля и, что я собираюсь делать Улыбающийся. Пока проблем не вижу.

Не видите? Сейчас увидите)
Что вы будете делать, если мне нужно посчитать сколько раз в тексте встречается выражение, скажем: Hello word! ?
Или я, например, хочу найти в тексте опечатки связанные с повторным написанием одного и того же слова (например the the) и т.д.
Или я хочу посчитать сколько раз в тексте встречается буква "a", сколько "b" и т.д.
Или..

Уже изначальное использование split'а для задач, которые вы пытаетесь решить - плохое решение. Ощущение, что это просто первое, что попалось вам под руку и вы этим тут же взялись строить дом..

Кстатии, по поводу дома:
Цитировать
Во вторых (не люблю аналогии, поскольку их коверкают), если вам необходимо построить дом и в вашем распоряжении весь арсенал инструментов, но пользоваться вы можете только молотком, то сколько бы вы в окно не смотрели и не представляли как должен выглядеть новый дом, легче от этого не станет.
Если "разумный" человек, берётся за постройку целого дома, более-менее представляя как пользоваться только молотком, то у меня вопрос о его разумности стоит под большим сомнением) Потому что в конечном счёте это выйдет ему гораздо дороже, как если бы он просто купил новый дом)

Я понимаю, что опыт тоже очень важен и на одной теории так просто далеко не уедешь. Но чтоб этот опыт приносил пользу нужно всё же параллельно и инструмент изучать и хвататься не за дом сразу, а скажем за табуретку, ну или за маленький домик для собаки)
   
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Spark
Гость
« Ответ #231 : Август 10, 2013, 11:46 »

Учеников можно критиковать, значит и программистов будем критиковать Улыбающийся.
Не видите? Сейчас увидите)
Что вы будете делать, если мне нужно посчитать сколько раз в тексте встречается выражение, скажем: Hello word! ?
Или я, например, хочу найти в тексте опечатки связанные с повторным написанием одного и того же слова (например the the) и т.д.
Или я хочу посчитать сколько раз в тексте встречается буква "a", сколько "b" и т.д.
Или..
Слишком простые задачки и на гора можно выдать их долго не думая. Но заниматься я этим не буду. Это просто никого не будет интересовать. Задача несколько серьезнее и более сложная. К тому же она, фактически, реализована Улыбающийся. Об этом как нибудь в другой раз.
Уже изначальное использование split'а для задач, которые вы пытаетесь решить - плохое решение. Ощущение, что это просто первое, что попалось вам под руку и вы этим тут же взялись строить дом..
Это весьма обдуманный шаг. Другое дело, что опыта нет. Ну что-ж когда то надо начинать.
Если "разумный" человек, берётся за постройку целого дома, более-менее представляя как пользоваться только молотком, то у меня вопрос о его разумности стоит под большим сомнением) Потому что в конечном счёте это выйдет ему гораздо дороже, как если бы он просто купил новый дом)
Хочешь остаться довольным, научись делать сам. Свои идеи я пытался продвинуть, упрашивая разработчика сделать каждый шаг. В результате везде недодел. А недоделанное это фактически ничто. И выходит это очень долго. И самое обидно в конце концов остаться не удел и выслушивать гадость по поводу того, что идеи ничего не значат, а вот именно код... Тогда почему программистов пруд пруди, а программ... Согласен, что должно быть все идеально и я предлагал работать совместно тем программистам. Закончилось все банальным плагиатом. Ну в общем тебе надо ты и делай. Делаю Улыбающийся. Хватит тянуться за соседом, надо просто сделать лучше.
Я понимаю, что опыт тоже очень важен и на одной теории так просто далеко не едешь. Но чтоб этот опыт приносил пользу нужно всё же параллельно и инструмент изучать и хвататься не за дом сразу, а скажем за табуретку, ну или за маленький домик для собаки)
Так а с чего вы взяли, что параллельно я ничего не читаю? Разве возможно сделать то, что я делаю не заглядывая в букварь, справочник...
- Заглядываю в справочники.
- Чужие примеры, исходники.
- Видеоуроки.
- Гуглю.
- Вопросы на форуме (очень важный момент, научиться не стесняться спрашивать, кто бы вам чего не наговорил).
Другое дело, что я не читаю учебник или справочник последовательно. Это бессмысленно. Есть задачка, важно знать где копнуть и пытаюсь воспроизвести, попутно приходит осознание происходящего. Конечно не совсем в буквальном смысле. Исходники слава богу по порядку могу читать и связать составляющие, особенно если не лениться Улыбающийся. Но конечно заглянув в справочник и увидев там новую конструкцию без реального примера, мало похожую, что на самом деле в исходнике, сложнова-то  правильно ее применить.

Все лирики больше не будет. Надо как то связать эти два варианта ввода информации и выдать для критики Улыбающийся.
« Последнее редактирование: Август 10, 2013, 11:48 от Spark » Записан
Spark
Гость
« Ответ #232 : Август 15, 2013, 20:55 »

Застрял.
Допустим создал и заполнил QStringList compoundList в compoundWord.cc. Не получается передать его в mainwindow.cc. Как попроще это сделать?
Записан
Spark
Гость
« Ответ #233 : Август 17, 2013, 17:45 »

Из mainwindow.cc добавляю пункты списка:
Код
C++ (Qt)
textory.addItem(Textory::Item(1, compoundWordItem));

Список находится в textory.cc:
Код
C++ (Qt)
void Textory::addItem( Item const & item )
{
 
...
 
  qDebug() << "adding item " << addingItem;
 
 emit itemsChanged();
}
Нет проблем с добавлением. Т.е. найденные слова добавляются в список и самое главное Улыбающийся отправляется сигнал:
Код
C++ (Qt)
emit itemsChanged()

Создаю compound.cc для поиска спец. пунктов. Срабатывает:
Код
C++ (Qt)
textory.addItem(Textory::Item(1, compoundWordItem));
Пункты доходят, о чем свидетельствует qDebug. Но вот сигнал при этом не срабатывает. Где могут быть грабли? На что обратить внимание?
« Последнее редактирование: Август 17, 2013, 17:51 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #234 : Август 17, 2013, 18:24 »

видимо сигнал не соединен со слотом в compound
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #235 : Август 17, 2013, 18:54 »

Compound.cc занимается поиском специальных пунктов списка и отправляет их в textory.cc. Который уже формирует сам список:
Код
C++ (Qt)
void Textory::addItem( Item const & item )
{
 
  items.prepend( item );
 
  qDebug() << "adding item " << addingItem;
 
 emit itemsChanged();
}
Сам же слот для этого сигнала находится в textorywidget.cc, который обновляет список на экране.
Вроде все просто и сами пункты доходят до void Textory::addItem( Item const & item ). Но вот с сигналом траблы.
Это при том, что отправляя пункты из mainwindow.cc в эту же функцию все работает нормально. И срабатывает эта связка SIGNAL->SLOT. Список  светится на экране Улыбающийся. Но вот спецсписок вывести не удается.
Вообще экспериментировал с другими слотами, не запускаются они если информация в textory.cc пришла не с mainwindow.cc.

Казалось главное доставить пункты до textory.cc, а там уже все само собой Улыбающийся. Доставил, но не тут то было, для меня.

Дело в том, что создавая на основе других исходников, конечно же допускаю ошибки. Надеюсь на то, что не очевидное для меня очевидно для специалистов и помогут разобраться. Может я допускаю типичные ошибки.
« Последнее редактирование: Август 17, 2013, 19:14 от Spark » Записан
Spark
Гость
« Ответ #236 : Август 17, 2013, 19:04 »

В textorywidget.cc есть уже такой слот:

Цитата: cpp
void TextoryModel::textoryChanged()
{
  qDebug() << "Textory Changed!";

  reset();
}

И qDebug показывает, что до него все уже доходит если пункт был отправлен через mainwindow.cc.
Записан
Spark
Гость
« Ответ #237 : Август 17, 2013, 19:20 »

Может не ясно описал ситуацию. Схематично:
Эта связка работает:
mainwindow.cc (доставка Item - работает) -> textory.cc  (сигнал-слот работает) -> textorywidget.cc

Эта связка не работает:
Compound.cc (доставка Item - работает) -> textory.cc  (сигнал-слот не работает) -> textorywidget.cc
« Последнее редактирование: Август 17, 2013, 19:24 от Spark » Записан
Spark
Гость
« Ответ #238 : Август 17, 2013, 20:19 »

Может как то хитро можно продиагностировать сигнал-слот?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #239 : Август 17, 2013, 20:51 »

видимо сигнал не соединен со слотом в compound
это значит, что ты connect не написал где-то в Compound.cc. посмотри как соединяется тот объект типа Textory в mainwindow.cc и сделай аналогично в Compound.cc. по волшебству сигналы и слоты не соединяются.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 ... 14 15 [16] 17 18   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.708 секунд. Запросов: 23.