0

我想为 Qt GUI 应用程序添加调试模式。在调试模式下,任何 GUI 小部件事件都会转储调试信息,而不是执行原始功能。例如,单击button A将打印出被选中的复选框选项,其中button A' 的原始功能是对所选选项进行处理。

我正在考虑添加一个菜单选项“ debug mode”,或者一个秘密的键盘快捷键来启用它。clicked并且在与widget信号( / textEdited)关联的回调函数中,if(isDebugMode)/else用于区分常规函数模式代码。

这是测试 GUI 功能的好模型吗?有没有更好的办法?

4

1 回答 1

1

您可能希望使用 Signal/Slot 系统进行调试。它让我想起了面向方面的编程。

  1. 编写一个Debug派生自该类的类,该类QObject包含多个具有典型签名的插槽。
  2. 在这些槽中,使用QObject::sender()函数来检索事件的发起者
  3. 将所有信号连接到调试槽以及它们的原始接收器。在根据调试模式标志运行的代码块中执行此操作。
  4. 连接来自 Qt 对象的附加信号以允许您跟踪应用程序的状态。例如,如果一个按钮读取了一个复选框选项,也将来自复选框的更改信号连接到您的调试槽,这样您就可以在单击按钮时从之前的输出中读取它们的状态。
  5. (如果您不希望执行原始操作,只需使信号连接同样以调试标志为条件,这次是相反的。)

这将帮助您保持大部分代码的调试内容干净。

为了获得灵感,下面是一些跟踪应用程序中焦点变化的示例代码:

调试.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();
于 2013-11-01T09:16:13.617 回答