這是我在這個網站上的第一個問題,我希望我會做得很好。爲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
「更好」的方式是使用Qt日誌框架。 https://doc.qt.io/qt-5/qloggingcategory.html#details – peppe
您是否希望在調試時始終輸出這些日誌,而不是在未調試時輸出這些日誌?在這種情況下,請使用qDebug類:http://doc.qt.io/qt-5/qdebug.html – DrDonut
我不想在調試時始終需要它們 我希望能夠在需要時禁用它們,因爲我想,它會在很長時間垃圾郵件的輸出 – ElevenJune