2016-01-25 38 views
0

這是我在這個網站上的第一個問題,我希望我會做得很好。爲Qt項目創建一個標誌或使用QLoggingCategory

我正在做一個使用大量信號和插槽的Qt項目,我想創建一個標誌/宏/變量來激活/停用std :: cout來跟蹤哪個信號發出以及哪個槽被激活

這是爲了調試目的,瞭解應用程序的不同組件如何交換和避免信號/插槽中的環路。

更具體地說,我將有一個標誌/變量在我的.pro:

QT_SIGNALS_SLOTS_LOG = true 

和我的源代碼:

if(QT_SIGNALS_SLOTS_LOG) 
    std::cout << "MyClass::slotMySlot activated" << std::endl; 

問題:

燦我做了這樣的事情(使用 代碼中的.pro變量)?

2.有沒有更好的方法呢?


更新1

Burich,這工作得很好,感謝

現在我會嘗試編寫一個Qt宏,我把我的插槽和至極做所有的工作

實施例:

Q_SIGNALS_SLOTS_LOG(); 

WH ich得到的類和插槽的名稱,並做

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"); 

禁用流。CPP

+0

「更好」的方式是使用Qt日誌框架。 https://doc.qt.io/qt-5/qloggingcategory.html#details – peppe

+0

您是否希望在調試時始終輸出這些日誌,而不是在未調試時輸出這些日誌?在這種情況下,請使用qDebug類:http://doc.qt.io/qt-5/qdebug.html – DrDonut

+0

我不想在調試時始終需要它們 我希望能夠在需要時禁用它們,因爲我想,它會在很長時間垃圾郵件的輸出 – ElevenJune

回答

1

在專業設置變量:

DEFINES += QT_SIGNALS_SLOTS_LOG 

測試它的代碼:

#ifdef QT_SIGNALS_SLOTS_LOG 
    std::cout << "MyClass::slotMySlot activated" << std::endl; 
#endif 
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作爲一般的「打印」功能,並在上面添加a debug enum處理在運行時輸出的調試類型。

它在Windows上處理UTF-8字符串作爲獎勵,並處理任何可以轉儲到std::cout的內容。你也可以改變它輸出的流,或者真正的函數體。

如果未定義宏DEBUGMYCODE,則預處理器將完全移除對debug_print的所有調用。 PS:如果你是Qt編碼,你應該使用qDebug(),它以完全不同的方式處理這個問題。

+0

MMMh,是的,這也可以做到! 因此,我創建了一個類,在例如一個Util文件夾中定義該類,並且我可以在我的代碼中的任何地方使用它? – ElevenJune

相關問題