这是我在这个网站上的第一个问题,我希望我能做得很好。
我正在使用大量信号和插槽进行Qt项目,我想创建一个标志/宏/变量来激活/停用std :: cout来跟踪哪个信号是发射并激活哪个插槽。
这是出于调试目的,了解应用程序的不同组件如何交换并避免信号/插槽中的循环。
更具体地说,我的.pro中会有一个标志/变量:
QT_SIGNALS_SLOTS_LOG = true
在我的源代码中:
if(QT_SIGNALS_SLOTS_LOG)
std::cout << "MyClass::slotMySlot activated" << std::endl;
问题:
1。我可以做那样的事情(使用.pro中的变量 代码)?
2。有更好的方法吗?
更新1
Burich,这很好用,谢谢
现在我将尝试编写一个Qt宏,我放入我的插槽并完成所有工作
示例:
Q_SIGNALS_SLOTS_LOG();
获取Class和Slot的名称并执行
ifdef QT_SIGNALS_SLOTS_LOG
std::cout << "MyClass::slotMySlot activated" << std::endl;
endif
有没有办法做到这一点?
更新2
我将QLoggingCategory Class用于此tutorial
我的Utils文件夹中有一个包含此代码的类
#ifndef SIGNALSLOTDEBUG_H
#define SIGNALSLOTDEBUG_H
#include<QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(logSignal)
Q_DECLARE_LOGGING_CATEGORY(logSlot)
inline static void debugSlotF( char const * caller_name )
{
qCDebug(logSlot) << __TIME__ << caller_name << "activated";
}
inline static void debugSlot(){
}
#define debugSlot() debugSlotF(__PRETTY_FUNCTION__)
#endif // SIGNALSLOTDEBUG_H
在我的代码中,我只是致电
void HorizontalPatternListScene::slotSelectionChanged(int i)
{
debugSlot();
....
我得到了这个输出:
log.slot: 12:06:54 void HorizontalPatternListScene::slotSelectionChanged(int) activated
我可以通过
禁用流QLoggingCategory::setFilterRules(
"log.slot=true\n"
"log.signal=false");
在我的main.cpp
中答案 0 :(得分:1)
在pro中设置变量:
DEFINES += QT_SIGNALS_SLOTS_LOG
在代码中测试:
#ifdef QT_SIGNALS_SLOTS_LOG
std::cout << "MyClass::slotMySlot activated" << std::endl;
#endif
答案 1 :(得分:0)
如果您愿意为此使用C ++ 11功能,可以执行以下操作:
#ifdef DEBUGMYCODE
template<typename... ArgTypes>
inline void print(ArgTypes... args)
{
// trick to expand variadic argument pack without recursion
using expand_variadic_pack = int[];
// first zero is to prevent empty braced-init-list
// void() is to prevent overloaded operator, messing things up
// trick is to use the side effect of list-initializer to call a function on every argument, in order.
// (void) is to suppress "statement has no effect" warnings
#ifdef _WIN32
std::stringstream stream;
(void)expand_variadic_pack{0, ((stream << args), void(), 0)... };
std::wstring stuff = convert_to_utf16(stream.str());
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), stuff.c_str(), stuff.size(), nullptr, nullptr);
#else
(void)expand_variadic_pack{0, ((std::cout << args), void(), 0)... };
#endif
}
#else
#define debug_print(...)
#endif
我在my code中使用此作为一般&#34; print&#34;函数并在顶部添加a debug enum以处理在运行时输出的调试类型。
它在Windows上处理UTF-8字符串作为奖励,并处理可以转储到std::cout
的任何内容。您还可以更改输出的流,或者无论函数的主体是什么。
如果未定义宏DEBUGMYCODE
,预处理器将完全删除对debug_print
的所有调用。
PS:如果您正在编码,那么您应该使用qDebug()
以完全不同的方式为您处理此问题。