Как получить вывод QString qDebug в виде строки?

Давайте посмотрим на это маленькое приложение:

#include <QString>
#include <QDebug>

int main(int argc, char *argv[]) {
  const auto test_string = 
    QString{"Some string \n \x01 \u0002 with some \r special chars"};
  qDebug() << test_string;
  qDebug(qPrintable(test_string));
}

Это дает следующий вывод:

"Some string \n \u0001 \u0002 with some \r special chars"
Some string
 special chars
Press <RETURN> to close this window...

Это демонстрирует, как оператор qDebug << поставляется с некоторой функциональностью, которая преобразует все специальные символы QString в некоторую читаемую строку, которую можно легко вставить в объявление строки в C++.

Я хотел бы использовать эту функцию для подачи строк в пользовательский каркас регистрации. Есть ли возможность использовать одну и ту же функцию преобразования напрямую?

По сути, это будет означать преобразование test_string в экземпляр QString, который дает одинаковый вывод для обоих приведенных выше операторов qDebug.

3 ответа

У меня была аналогичная проблема, но я хотел использовать свой собственныйoperator<<перегрузка, которая была определена дляQDebug, поэтому я сделал следующее:

      // This could be anything that provides an 'operator<<' overload.
QString value = "Hello, world!";

QString result;
QDebug{ &result } << value;

Один полный пример

      // Create by BaiJiFeiLong@gmail.com at 2023-08-11 11:15:13+0800
#include <QtCore/QDebug>
#include <QtCore/QPoint>
#include <QtGui/QColor>
#include <iostream>

template<class T>
std::string qDebugToString(const T &t) {
    QString text;
    QDebug{&text} << t;
    return text.mid(1, text.length() - 2).toStdString();
}

int main() {
    std::cout << "Point: " << qDebugToString(QPoint(1280, 720)) << std::endl;
    std::cout << "Color: " << qDebugToString(QColor("violet")) << std::endl;
    std::cout << "Empty: " << qDebugToString("") << std::endl;
}

Консольный вывод

      Point: Point(1280,720)
Color: Color(ARGB 1, 0.933333, 0.509804, 0.933333)
Empty: 

У меня был тот же вопрос, и я не нашел полного ответа (пока). Однако я нашел QVariant что позволяет вам звонить toString() на самых основных типах C и Qt:

QVariant("foo").toString(); // "foo"
QVariant(true).toString(); // "true"
QVariant(QDateTime("2020-11-28")).toString(); // "2020-11-28"

Затем вы можете обернуть это одним методом:

QString variantToString(const QVariant variant) {
    return (variant.userType() != QMetaType::QString
            && variant.canConvert(QMetaType::QStringList))
        ? "(" + variant.toStringList().join(", ") + ")"
        : variant.toString();
}

variantToString(42); // "42" // works due to implicit cast

Вы можете сделать несколько дополнительных проверок для типов, не поддающихся строковой обработке (см. Также canConvert() и userType(), например списки, регулярные выражения или все, что вам нужно, но я полностью согласен с тем, что было бы лучше повторно использовать собственные функции ведения журнала Qt...

Другие вопросы по тегам