QTextStream :: readAll возвращает пустое QString

Я пытался перебрать всех детей определенного узла XML и присоединиться к их name атрибутов. Структура:

<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, хотя в преддверии я предпочитаю первое.

0

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]