スクリーンリーダー対応の Qt GUI アプリケーション開発:QAccessibleActionInterface を活用したアクセシビリティソリューション


QAccessibleActionInterface::~QAccessibleActionInterface()は、Qt GUIにおけるアクセシビリティ機能の一つであるQAccessibleActionInterfaceクラスのデストラクタです。このデストラクタは、QAccessibleActionInterfaceオブジェクトが破棄されるときに自動的に呼び出され、オブジェクトが占有していたリソースを解放します。

機能

QAccessibleActionInterface::~QAccessibleActionInterface()は以下の機能を実行します。

  • 親クラスのデストラクタを呼び出します。
  • 仮想関数ポインタテーブルをクリアします。
  • QAccessibleActionInterfaceオブジェクトが保持していたすべてのデータ構造とメモリを解放します。

使用方法

QAccessibleActionInterface::~QAccessibleActionInterface()は、直接呼び出す必要はありません。QAccessibleActionInterfaceオブジェクトが破棄されるときに自動的に呼び出されます。

class MyAccessibleWidget : public QAccessibleWidget, public QAccessibleActionInterface
{
public:
    MyAccessibleWidget(QWidget* parent) : QAccessibleWidget(parent) {}

    ~MyAccessibleWidget() override {}

private:
    QStringList actionNames() const override {
        return QStringList{"pressAction"};
    }

    void doAction(const QString& actionName) override {
        if (actionName == "pressAction") {
            // ボタンが押されたときの処理
        }
    }
};

上記の例では、MyAccessibleWidgetクラスはQAccessibleActionInterfaceを継承し、pressActionというアクションをサポートしています。MyAccessibleWidgetオブジェクトが破棄されるときに、QAccessibleActionInterface::~QAccessibleActionInterface()が自動的に呼び出され、オブジェクトが占有していたリソースが解放されます。

  • QAccessibleActionInterfaceを実装するオブジェクトは、doAction()関数を使用して、アクションが実行されたときに実行する処理を定義します。
  • QAccessibleActionInterfaceを実装するオブジェクトは、actionNames()関数を使用してサポートするアクションのリストを返します。
  • QAccessibleActionInterfaceは、アクセシブルなオブジェクトがユーザーとのインタラクションをサポートするために使用するインターフェースです。


class MyAccessibleWidget : public QAccessibleWidget, public QAccessibleActionInterface
{
public:
    MyAccessibleWidget(QWidget* parent) : QAccessibleWidget(parent) {}

    ~MyAccessibleWidget() override {}

private:
    QStringList actionNames() const override {
        return QStringList{"pressAction"};
    }

    void doAction(const QString& actionName) override {
        if (actionName == "pressAction") {
            // ボタンが押されたときの処理
            QMessageBox::information(this, "ボタンが押されました", "ボタンが押されました。");
        }
    }
};

このコードを実行すると、以下のようになります。

  1. MyAccessibleWidgetオブジェクトが作成されます。
  2. MyAccessibleWidgetオブジェクトがアクセシブルなオブジェクトとして登録されます。
  3. スクリーンリーダーなどのアクセシビリティツールを使用して、MyAccessibleWidgetオブジェクトを操作することができます。
  4. ユーザーがMyAccessibleWidgetオブジェクト上のボタンを押すと、doAction()関数が呼び出され、ボタンが押されたことを示すメッセージボックスが表示されます。

例2:QAccessibleActionInterfaceを継承したカスタムアクションクラス

この例では、QAccessibleActionInterfaceを継承したカスタムアクションクラスを作成し、QAccessibleActionクラスを使用してアクションオブジェクトを作成します。

class MyCustomAction : public QAccessibleActionInterface
{
public:
    MyCustomAction(const QString& name) : m_name(name) {}

    ~MyCustomAction() override {}

private:
    QStringList actionNames() const override {
        return QStringList{m_name};
    }

    void doAction(const QString& actionName) override {
        if (actionName == m_name) {
            // アクションが実行されたときの処理
            QMessageBox::information(this, "アクションが実行されました", m_name + "アクションが実行されました。");
        }
    }

    QString m_name;
};

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QWidget widget;
    QAccessibleAction* action = new MyCustomAction("MyCustomAction");
    QAccessibleInterface* accessibleInterface = action->accessibleInterface();
    widget.setAccessibleInterface(accessibleInterface);

    widget.show();

    return app.exec();
}
  1. MyCustomActionオブジェクトが作成されます。
  2. QAccessibleActionオブジェクトが作成され、MyCustomActionオブジェクトに関連付けられます。
  3. QAccessibleInterfaceオブジェクトが作成され、QAccessibleActionオブジェクトに関連付けられます。
  4. QWidgetオブジェクトが作成され、QAccessibleInterfaceオブジェクトに関連付けられます。
  5. QWidgetオブジェクトが表示されます。
  6. ユーザーがQWidgetオブジェクト上のボタンを押すと、doAction()関数が呼び出され、アクションが実行されたことを示すメッセージボックスが表示されます。


QObject::deleteLater()を使用する

QObject::deleteLater()関数は、オブジェクトをイベントループの次のイベント処理時に削除するようにスケジュールします。この関数を呼び出すことで、オブジェクトが破棄される前にQAccessibleActionInterface::~QAccessibleActionInterface()を明示的に呼び出すことができます。

class MyAccessibleWidget : public QAccessibleWidget, public QAccessibleActionInterface
{
public:
    MyAccessibleWidget(QWidget* parent) : QAccessibleWidget(parent) {}

    ~MyAccessibleWidget() override {}

private:
    QStringList actionNames() const override {
        return QStringList{"pressAction"};
    }

    void doAction(const QString& actionName) override {
        if (actionName == "pressAction") {
            // ボタンが押されたときの処理
        }
    }

    void deleteLater() override {
        // QAccessibleActionInterface::~QAccessibleActionInterface()を明示的に呼び出す
        QAccessibleActionInterface::~QAccessibleActionInterface();

        // 親クラスのdeleteLater()を呼び出す
        QObject::deleteLater();
    }
};

QAccessibleInterface::release()を使用する

QAccessibleInterface::release()関数は、オブジェクトが保持しているアクセシブルインターフェースを解放します。この関数を呼び出すことで、QAccessibleActionInterfaceオブジェクトが破棄される前に、QAccessibleActionInterfaceインターフェースを解放することができます。

class MyAccessibleWidget : public QAccessibleWidget, public QAccessibleActionInterface
{
public:
    MyAccessibleWidget(QWidget* parent) : QAccessibleWidget(parent) {}

    ~MyAccessibleWidget() override {}

private:
    QStringList actionNames() const override {
        return QStringList{"pressAction"};
    }

    void doAction(const QString& actionName) override {
        if (actionName == "pressAction") {
            // ボタンが押されたときの処理
        }
    }

    void deleteLater() override {
        // QAccessibleActionInterfaceインターフェースを解放する
        accessibleInterface()->release();

        // 親クラスのdeleteLater()を呼び出す
        QObject::deleteLater();
    }
};

注意事項

上記の方法を使用する場合は、以下の点に注意する必要があります。

  • QAccessibleInterface::release()関数を呼び出すと、オブジェクトが保持しているすべてのアクセシブルインターフェースが解放されます。他のアクセシブルインターフェースを使用している場合は、それらを解放する前にrelease()関数を呼び出す必要があります。
  • QAccessibleActionInterface::~QAccessibleActionInterface()を明示的に呼び出す前に、オブジェクトがまだ使用されていないことを確認する必要があります。