2016-06-09 2 views
-2

У меня есть текстовый файл, содержащий следующие строки:Как фильтровать содержимое текстового файла с помощью QRegExp?

a1  b00  2222 
a1  b01  233 
a1  b92  34444 
a2  b00  2222 
a2  b00  3333 
a2  b01  3333 

Я хочу, чтобы прочитать этот файл и отфильтровать текст с помощью QRegExp

и заполнить результат на три QComboBox combo1, для первого согласующего случае combo2 к второй совпадающий регистр и combo3 в третий соответствующий регистр. Результат выглядит следующим образом:

combo1 
a1 
a2 

при выборе a2 из combo1 затем combo2 будет

combo2 
    b00 
    b01 

и при выборе B00 из combo2, combo3 будет

combo3 
2222 
3333 

Я убежищем» t работал с QRegExp, может кто-нибудь покажет мне, как это сделать?

ответ

2

Я предлагаю вам не использовать QRegExp, чтобы отфильтровать это. Поскольку вы работаете с файлом с ограниченным пробелом, очень просто, просто прочитайте это в vector и используйте его для заполнения QComboBox es. Например:

ifstream foo("foo.txt"); 
vector<string> combos{istream_iterator<string>(foo), istream_iterator<string>()}; 

for(auto i = 0; i < size(combos); ++i) { 
    switch(i % 3) { 
    case 0: 
     combo1.addItem(combos[i]); 
     break; 
    case 1: 
     combo2.addItem(combos[i]); 
     break; 
    case 2: 
     combo3.addItem(stoi(combos[i])); 
    } 
} 

Live Example

Обратите внимание, что вы могли бы также использовали QTextStream и читать их непосредственно в QString или даже QStringList. Я решил не делать этого, чтобы ваша бизнес-логика была отделена от вашей логики GUI.

+1

Что такое «размер» здесь? (EDIT) Я думаю, что не все компиляторы поддерживают 'std :: size'. – Ajay

+0

@Jonathan Mee Я могу прочитать текстовый файл и заполнить inot вектор строки, но я хочу просто проверить, как QRegExp работает в этом примере, я хочу использовать match и cap в этом случае. –

+0

@Ajay Вы правы ['size'] (http://en.cppreference.com/w/cpp/iterator/size) - это C++ 17. Если у вас нет C++ 17, вам нужно использовать 'combos.size()'. Но если у вас есть * C++ 17, я даю хороший аргумент в пользу того, почему 'size (combos)' теперь предпочтительнее, чем 'combos.size()' здесь: http://stackoverflow.com/questions/33442629/ do-c-have-a-free-function-sizeobject/33442842 # 33442842 –

-1

QRegExp, что мне нужно фильтровать (матч) каждая строка это

QRegExp rx("\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*"); 
    if (rx.exactMatch(line) //to cehck if rx matches the line from the text file 
     { 
      QString col1 = rx.cap(1);//the first column that goes to combo1 
      QString col2 = rxHeader.cap(2);//the second column that goes to combo2 
      QString col2 = rxHeader.cap(3);//the third column that goes to combo3 
     } 

Сейчас он работает со мной.

+0

Если вы добавили в код, который действительно обрабатывал файл, это сработало бы. Но, по крайней мере, для предоставленного примера и, вероятно, для любого файла с разделителями пробелов, это более низкое решение. Я бы посоветовал вам рассмотреть [мое решение] (http: // stackoverflow.com/a/37724418/2642059) в качестве предпочтительной альтернативы. –

+0

как я сказал, это просто проверить, как regexp в qt работает. –

+0

В Qt5 вы захотите использовать [QRegularExpression] (http://doc.qt.io/qt-5/qregularexpression.html), у него отличная запись на его использование: http: //doc.qt. io/qt-5/qregularexpression.html # details Вы найдете ответы на вопросы о том, как выполнить задачу, будут отвечать ответы, используя правильный инструмент здесь, на http://www.stackoverflow.com, однако, если вы хотите прочитать Qt написал и задал вопросы о конкретном вопросе и должен был опубликовать их, я уверен, что вы получите очень отличные ответы. Если вы окажетесь в такой ситуации, не стесняйтесь связывать новый вопрос, и я постараюсь ответить также. –