您可能希望使用 Signal/Slot 系统进行调试。它让我想起了面向方面的编程。
- 编写一个
Debug
派生自该类的类,该类QObject
包含多个具有典型签名的插槽。
- 在这些槽中,使用
QObject::sender()
函数来检索事件的发起者
- 将所有信号连接到调试槽以及它们的原始接收器。在根据调试模式标志运行的代码块中执行此操作。
- 连接来自 Qt 对象的附加信号以允许您跟踪应用程序的状态。例如,如果一个按钮读取了一个复选框选项,也将来自复选框的更改信号连接到您的调试槽,这样您就可以在单击按钮时从之前的输出中读取它们的状态。
- (如果您不希望执行原始操作,只需使信号连接同样以调试标志为条件,这次是相反的。)
这将帮助您保持大部分代码的调试内容干净。
为了获得灵感,下面是一些跟踪应用程序中焦点变化的示例代码:
调试.hpp
class Debug : public QObject
{
Q_OBJECT
...
// method for debugging focus
void focusChange(QWidget * old, QWidget * now);
};
调试.cpp
void Debug::focusChange(QWidget *old, QWidget *now)
{
if (!old || !now)
return;
std::cerr << "Focus changed from " << old->objectName().toStdString()
<< " to " << now->objectName().toStdString() << std::endl;
}
主文件
QApplication app(argc, argv);
Debug dbg;
...
app.connect(&app, SIGNAL(focusChanged(QWidget*, QWidget*)),
&debug, SLOT(focusChange(QWidget*, QWidget*)));
// run Qt event loop
return app.exec();