为Qt项目创建一个标志或使用QLoggingCategory

时间:2016-01-25 14:15:27

标签: c++ qt qt-creator

这是我在这个网站上的第一个问题,我希望我能做得很好。

我正在使用大量信号和插槽进行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

2 个答案:

答案 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()以完全不同的方式为您处理此问题。