0

Qt GUI アプリケーションのデバッグ モードを追加したいと考えています。デバッグ モードでは、GUI ウィジェット イベントは、元の機能を実行するのではなく、デバッグ情報をダンプします。たとえば、クリックするbutton Aと、選択されているチェックボックスのオプションが出力されます。ここで、button Aの元の機能は、選択されたオプションに対して何かを処理することです。

メニュー オプション " debug mode"、またはそれを有効にするための秘密のキーボード ショートカットを追加することを考えていました。また、ウィジェット シグナルに関連付けられたコールバック関数 ( clicked/ textEdited) では、if(isDebugMode)/else通常の関数モード コードを区別するために使用します。

これは、GUI 機能をテストするのに適したモデルですか? もっと良い方法はありますか?

4

1 に答える 1

1

デバッグには Signal/Slot システムを使用することをお勧めします。アスペクト指向プログラミングを思い出します。

  1. 典型的なシグネチャを持ついくつかのスロットを保持Debugする派生クラスを作成します。QObject
  2. これらのスロットで、QObject::sender()関数を使用してイベントの発信元を取得します
  3. 元の受信機に加えて、すべての信号をデバッグ スロットに接続します。これは、デバッグ モード フラグの条件で実行されるコード ブロックで行います。
  4. Qt オブジェクトから追加の信号を接続して、アプリケーションの状態を追跡できるようにします。たとえば、ボタンがチェックボックス オプションを読み取る場合は、チェックボックスからの変更信号もデバッグ スロットに接続して、ボタンがクリックされたときに前の出力から状態を読み取ることができるようにします。
  5. (元のアクションを実行したくない場合は、今度は逆に、デバッグ フラグを均等に条件付けて信号を接続するだけです。)

これは、コードの大部分をデバッグ用のものからきれいに保つのに役立ちます。

参考までに、アプリケーション内でフォーカスの変更を追跡するサンプル コードを次に示します。

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();
于 2013-11-01T09:16:13.617 に答える