QString и двойные кавычки [дубликат]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

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

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

13
задан Michael 16 January 2015 в 03:54
поделиться

4 ответа

Почему?

Это из-за реализации qDebug() .

Из исходного кода :

inline QDebug &operator<<(QChar t) { stream->ts << '\'' << t << '\''; return maybeSpace(); }
inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t  << '\"'; return maybeSpace(); }

Поэтому

QChar a = 'H';
char b = 'H';
QString c = "Hello";

qDebug()<<a;
qDebug()<<b;
qDebug()<<c;

выводит

'H' 
 H 
"Hello"

Комментарий

Итак, почему Qt делает это? Поскольку qDebug предназначен для отладки, входы различного типа станут текстовыми потоками через qDebug.

Например, qDebug печатает логическое значение в текстовое выражение true / false:

inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }

Он выводит true или false на ваш терминал. Поэтому, если у вас есть QString, который хранит true, вам нужно указать метку кавычки ", чтобы указать тип.

12
ответ дан Tay2510 22 August 2018 в 11:06
поделиться
  • 1
    Вот почему qPrintable (const QString) удаляет кавычки. Большое спасибо. – Michael 16 January 2015 в 04:30
  • 2
    @Michael Nope. Я думаю, что это просто какой-то эстетический вопрос. qDebug просто хочу подчеркнуть разницу в типе, чтобы использовать " до любезно , напомнит вам тип QString. В конце концов, он предназначен для отладки, а не для печати. – Tay2510 16 January 2015 в 04:33
  • 3
    Да, но qPrintable возвращает const char * и в соответствии с исходным кодом, который вы указали, когда const char * передается в качестве аргумента в & lt; & lt; оператор QDebug не добавляет кавычки. Поправьте меня если я ошибаюсь. – Michael 16 January 2015 в 04:37
  • 4
    @ Майкл. Вы правы в этом. Вы также можете обратиться к ответу MrEricSir, чтобы удалить метку цитаты и мое последнее изменение, чтобы увидеть мотивацию, стоящую за ". – Tay2510 16 January 2015 в 04:40
  • 5
    Предоставление исходного кода было хорошим. – Nejat 16 January 2015 в 07:48

Просто добавлено к const char *

qDebug() << (const char *)yourQString.toStdString().c_str();
2
ответ дан hfrmobile 22 August 2018 в 11:06
поделиться
  • 1
    Qt включает функцию, которая в основном делает это: const char * qPrintable ( const QString & str ) – btse 21 June 2018 в 12:12

Qt 5.4 имеет новую функцию, которая позволяет вам отключить эту функцию. Чтобы указать документацию :

QDebug & amp; QDebug :: noquote ()

Отключает автоматическую вставку кавычек вокруг содержимого QChar, QString и QByteArray и возвращает ссылку на поток.

Эта функция была введена в Qt 5.4.

См. также quote () и maybeQuote ().

(Emphasis mine.)

Вот пример того, как вы будете использовать этот feature:

QDebug debug = qDebug();
debug << QString("This string is quoted") << endl;
debug.noquote();
debug << QString("This string is not") << endl;

Другой вариант - использовать QTextStream с stdout. Вот пример этого в документации :

QTextStream out(stdout);
out << "Qt rocks!" << endl;
21
ответ дан Nejat 22 August 2018 в 11:06
поделиться
  • 1
    Прохладный, чтобы знать, спасибо. Но почему-то при компиляции я получаю, что QDebug :: noquote () не определен как член QDebug в Linux-версии Qt. Может быть, потому, что он основан только на Qt 5.4. – Michael 16 January 2015 в 04:46
  • 2
    @Michael Я добавил пример, посмотрим, поможет ли это. – MrEricSir 16 January 2015 в 05:15
  • 3
    @MrEricSir Я использую qDebug().noquote() << QStringRef(back, i, cols); ... Я думаю, что это то же самое, а также попробовал ваш пример, но я продолжаю получать сообщение об ошибке: noquote () не является членом QDebug, спасибо за помощь, но это, вероятно, из-за моего Qt версия. Это версия Linux, и на самом деле это не 5.4, а просто основано на 5.4, может быть, это и есть причина. – Michael 16 January 2015 в 05:23
  • 4
    Это работает и может быть полезным в некоторых ситуациях, но имеет большой недостаток: выход отладки (по крайней мере, в моей системе) не печатается до тех пор, пока объект QDebug не будет уничтожен, поэтому вы, возможно, не получите отладочный вывод, пока приложение не будет выключить (в какой момент это технически больше не отлаживает / выводит журнал ...) – ssc 15 December 2016 в 16:25

Qt 4: Если строка содержит только ASCII, это может помочь в следующем обходном пути:

qDebug() << QString("TEST").toLatin1().data();
2
ответ дан Winfried Schenke 22 August 2018 в 11:06
поделиться
  • 1
    Это действительно допустимое обходное решение для bugreports.qt.io/browse/QTBUG-48517 . .data() будет отображать содержимое строки в Qt5, как и в Qt4. Я уверен, что он занижен из-за ненужного toLatin1, но это может быть изменено на toUtf8 и т. Д. – tresf 10 October 2016 в 23:44
Другие вопросы по тегам:

Похожие вопросы: