Qt GUI应用程序的调试模式

时间:2013-11-01 09:06:42

标签: debugging qt4

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 编写一个Debug类派生自QObject,其中包含几个带有典型签名的插槽。
  2. 在这些广告位中,使用QObject::sender()功能检索事件的发起人
  3. 将所有信号连接到原始接收器的调试插槽。在调试模式标志条件下运行的代码块中执行此操作。
  4. 连接来自Qt对象的其他信号,以便您跟踪应用程序的状态。例如。如果按钮读取复选框选项,也会将复选框中的更改信号连接到调试槽,以便在单击按钮时从上一个输出中读取它们的状态。
  5. (如果您不希望执行原始操作,只需将信号连接等同于调试标志,这次反过来。)
  6. 这将帮助您保持大部分代码清理调试内容。

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

    debug.hpp

    class Debug : public QObject
    {
        Q_OBJECT
        ...
        // method for debugging focus
        void focusChange(QWidget * old, QWidget * now);
    };
    

    debug.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;
    }
    

    的main.cpp

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