- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 qDebug()
、qInfo()
等结合 qInstallMessageHandler
来编写我的日志文件
。在执行我的应用程序时,我还在批处理屏幕上获得了输出。
我只找到了 QT_NO_DEBUG_OUTPUT
,但我想在运行时切换此配置。有没有办法阻止 Qt 写入标准输出?
最佳答案
sadly no, you only get access to the messages, but cannot prevent from beeing written to std output.
至少在 Qt 5 中这是错误的。消息打印代码looks as follows : 您可以清楚地看到仅使用了消息处理程序:
if (grabMessageHandler()) {
// prefer new message handler over the old one
if (msgHandler.load() == qDefaultMsgHandler
|| messageHandler.load() != qDefaultMessageHandler) {
(*messageHandler.load())(msgType, context, message);
} else {
(*msgHandler.load())(msgType, message.toLocal8Bit().constData());
}
ungrabMessageHandler();
} else {
fprintf(stderr, "%s\n", message.toLocal8Bit().constData());
}
如您所见,仅当从 messageHandler
自身内部检测到递归时,fprintf(stderr, ...)
才是回退。
因此,要防止任何调试输出,您只需实现和设置您自己的 messageHandler
。
要完全关闭 Qt 中的所有调试输出,可以执行以下操作:
#include <QtCore>
int main() {
qDebug() << "I'm not quiet at all yet";
qInstallMessageHandler(+[](QtMsgType, const QMessageLogContext &, const QString &){});
qDebug() << "I'm very, very quiet";
}
在任何情况下,应用程序范围的文件记录器的合理实现可能如下所示 - 它不会不必要地重新创建 QTextStream
;它使用 QString::toUtf8()
代替,并显式写入行尾。
#include <QtCore>
class Logger {
static struct Data {
Logger *instance;
QtMessageHandler chainedHandler;
} d;
bool m_isOpen;
QFile m_logFile;
QtMessageHandler m_oldHandler = {};
static void handler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
if (d.instance)
d.instance->log(msg);
if (d.chainedHandler)
d.chainedHandler(type, context, msg);
}
public:
enum ChainMode { DontChain, Chain };
Logger() {
Q_ASSERT(!instance());
m_logFile.setFileName("myLog.txt");
m_isOpen = m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
d.instance = this;
}
~Logger() { uninstallHandler(); }
bool isOpen() const { return m_isOpen; }
void installHandler(ChainMode mode) {
Q_ASSERT(!m_oldHandler);
m_oldHandler = qInstallMessageHandler(handler);
if (mode == Chain)
d.chainedHandler = m_oldHandler;
}
void uninstallHandler() {
if (m_oldHandler) {
m_oldHandler = nullptr;
d.chainedHandler = nullptr;
qInstallMessageHandler(m_oldHandler);
}
}
/// This method is *not* thread-safe. Use with a thread-safe wrapper such as `qDebug`.
void log(const QString & msg) {
if (isOpen()) {
m_logFile.write(msg.toUtf8());
m_logFile.write("\n", 1);
}
}
/// Closes the log file early - this is mostly used for testing.
void endLog() {
uninstallHandler();
m_logFile.close();
}
static Logger *instance() { return d.instance; }
};
Logger::Data Logger::d;
template <typename T> QByteArray streamOutputFor(const T &data) {
QBuffer buf;
buf.open(QIODevice::ReadWrite | QIODevice::Text);
QTextStream s(&buf);
s << data << endl;
buf.close();
return buf.data();
}
QByteArray readEnd(const QString &fileName, int count) {
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text) && file.size() >= count) {
file.seek(file.size() - count);
return file.readAll();
}
return {};
}
void test() {
auto const entry = QDateTime::currentDateTime().toString().toUtf8();
Q_ASSERT(Logger::instance()->isOpen());
qDebug() << entry.data();
Logger::instance()->endLog();
auto reference = streamOutputFor(entry.data());
auto readback = readEnd("myLog.txt", reference.size());
Q_ASSERT(!reference.isEmpty());
Q_ASSERT(readback == reference);
}
int main() {
Logger logger;
logger.installHandler(Logger::DontChain);
qDebug() << "Something or else";
test();
}
关于c++ - 防止 qDebug() 写入标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50875371/
我尝试将 Qt 与 CLion 一起使用。我的问题是 qDebug() 不打印任何内容,但 qInfo()、qWarning()、qCritical() 和 qFatal() 效果很好。这是我的示例代
我们的应用程序中有一段简单的代码: void tAccessPoint::OnStateChanged(QAbstractSocket::SocketState state) { qDebug
我正在尝试使用 QDebug 以十六进制格式显示一个数字。下面是我写的代码。它正在工作,但输出的字符串内容用双引号括起来: 如何删除这些引号? m_CanMsg_ptr->id = 0x720; m_
我一直在调试一个简单的目录应用程序,这个问题开始困扰我。我想创建一个模式对话框,它将接收用户对所显示数据的输入。我有一个简单的结构来保存目录项数据: struct ItemData { int
在我的测试用例中,我想断言 qDebug() 的输出包含某个字符串。例如,这是我的测试的样子。注意 qdebug 输出的“绑定(bind)到 UDP 端口 34772”。我可以从我的测试函数中测试子字
我只是尝试使用 qDebug 打印一个数字,如下所示: qDebug() << QString::number(03001); 但结果是: "1537" 如果我尝试在没有第一个零的情况下打印: qDe
通常当我需要调试某些东西时,使用 qDebug() 打印一些东西比使用调试器逐步调试更容易。问题是 qDebug() 的输出有时根本不显示!与 qWarning 和 qCritical 相同。奇怪的是
我正在使用 C++/Qt 打印函数 qDebug,但有时我想控制如何附加“、空格和换行符并且不使用默认的 qDebug。 我们举个简单的例子: QString var1("some string");
qDebug() 是线程安全的吗?我所说的线程安全不仅仅是指不崩溃,而且如果我从不同的线程调用 qDebug() ,输出是否可能会混淆?我用这段代码对其进行了测试,但似乎并非如此,但是,我在他们谈论这
我在 Qt 5.3.1 中构建了一个 QWidgets 应用程序,并且在某些地方使用了 qDebug() 为了测试这个问题,我构建了一个准系统 QWidgets 应用程序(属于 QMainWindo
我正在使用 qDebug()、qInfo() 等结合 qInstallMessageHandler 来编写我的日志文件。在执行我的应用程序时,我还在批处理屏幕上获得了输出。 我只找到了 QT_NO_D
我想将 qDebug() 输出保留在日志文件中并将其显示在控制台上,我试过这个: qDebug() << "Hand's up!"; QTextStream stream(stdout); QText
我在整个代码中都使用了 qDebug。现在我想通过翻译单元限制它的输出,定义一个单独的宏来启用/禁用翻译单元中的 qDebug 输出: 测试.pro: DEFINES += NO_DEBUG_ONE
我写了一个用于测试数据库连通性的 qt 小型控制台实用程序,代码块是: db.setHostName("hostIP"); db.setDatabaseName("name"); db.s
我见过一些使用 qDebug 的 Qt 代码,就好像它是 printf() qDebug( format, ... ); 大多数时候我看到它像 std::cout 一样使用 qDebug() << "
qDebug()可以输出二进制格式的数据吗? 例如,我想检查一些状态变化: unsigned char status; ... qDebug() << "Status: " << status; 我想
我想使用 qDebug()、qInfo() 等具有自定义默认浮点精度和数字格式的函数。 有没有办法在全局范围内定义它? 想象一下: double num = 1.2; qDebug() << "My
我尽量避免在 QT 程序中混合 QString 和 char* 类型。我有一个对话函数,它返回 QString 中的数据指针,但我得到了非常奇怪的结果。这段代码有什么问题? 编译器及环境 gcc (D
我一直想知道是否可以使用 Qt C++ 中的 qDebug() 语句收集用户输入。 我试着像在标准 C++ 代码中那样做: qDebug() >> myvar; 但是没有用。 如何使用 Qt 从 st
我有一个 QByteArray 来存储从 GPS 接收到的数据,该数据部分是二进制,部分是 ASCII。我想知道调试建议知道收到了什么,所以我正在写一个 qDebug 像这样: //QByteArra
我是一名优秀的程序员,十分优秀!