Как получить вывод 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...