2015-10-05 4 views
0

Я пытался пропустить все дочерние узлы определенного узла XML и присоединиться к их атрибутам name. Структура:QTextStream :: readAll возвращает пусто QString

<params> 
    <param name="BLAH" /> 
</params> 

Желаемый результат:

PARAM1='$PARAM1',PARAM2='$PARAM2',PARAM3='$PARAM3'[...] 

Код:

// Create empty text stream 
    QTextStream paramNames(""); 
    // Start looping child by child 
    QDomElement child = params.firstChildElement(); 
    bool firstIteration = true; 
    while(!child.isNull()) { 
     QString param_name = child.attribute("n"); 
     // Skips empty names 
     if(param_name.length()>0) { 
      // This prevents both leading and trailing comma 
      if(!firstIteration) 
       paramNames<<","; 
      else 
       firstIteration = false; 
      // This should fill in one entry 
      paramNames<<param_name<<"='$"<<param_name<<'\''; 
     } 
     child = child.nextSiblingElement(); 
    } 

Теперь даже отладчик говорит, что если я

QString paramNamesSTR = paramNames.readAll(); 

paramNamesSTR является пустую строку. Однако, если я использую std библиотеку вместо этого, все работает:

std::stringstream paramNames(""); 
    QDomElement child = params.firstChildElement(); 
    bool firstIteration = true; 
    while(!child.isNull()) { 
     std::string param_name = child.attribute("n").toUtf8().constData(); 
     if(param_name.length()>0) { 
      if(!firstIteration) 
       paramNames<<","; 
      else 
       firstIteration = false; 
      paramNames<<param_name<<"='$"<<param_name<<'\''; 
     } 
     child = child.nextSiblingElement(); 
    } 
    QString paramNamesSTR = QString::fromStdString(paramNames.str()); 

Так в чем разница? Почему Qt QTextStream возвращает пустую строку? Я бы предпочел быть совместимым с используемыми библиотеками и поэтому использовать QTextStream, а не std::stringstream, хотя прежде всего я предпочитаю первое.

ответ

3

Для использования QTextStream вам необходимо передать ему что-то для работы (сам поток не хранит никаких данных, он просто работает с строкой или iodevice). Передача этого строкового литерала - неправильная вещь. Разница заключается в том, когда вы создаете std::stringstream и передаете ему строковый литерал, базовый буфер потока создается автоматически, и этот литерал используется как начальное значение буфера. В случае QTextStream, который создал поток только для чтения, содержащий переданный литерал. Правильный способ создать QTextStream бы создать буфер, а затем создать поток для работы на этот буфер, например:

QString string; //you can also use a QByteArray, or any QIODevice 
QTextStream stream(&string); 
+0

И я достигаю поток полноценность, используя этот оригинальный 'QString', или я все еще называю 'readAll'? Если он сохраняет данные в 'QString', это не так хорошо, как использование' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '+'? –

+0

@ TomášZato, вы можете сделать это в любом случае. – SingerOfTheFall

+0

Я тестировал код, и он работает, поэтому спасибо. Однако я немного, но не знаю, должен ли я даже беспокоиться о 'TextStream', когда он ведет себя так же, как если бы я просто использовал' + 'для присоединения к строкам ... –