スクリーンリーダー対応の 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, "ボタンが押されました", "ボタンが押されました。");
}
}
};
このコードを実行すると、以下のようになります。
MyAccessibleWidget
オブジェクトが作成されます。MyAccessibleWidget
オブジェクトがアクセシブルなオブジェクトとして登録されます。- スクリーンリーダーなどのアクセシビリティツールを使用して、
MyAccessibleWidget
オブジェクトを操作することができます。 - ユーザーが
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();
}
MyCustomAction
オブジェクトが作成されます。QAccessibleAction
オブジェクトが作成され、MyCustomAction
オブジェクトに関連付けられます。QAccessibleInterface
オブジェクトが作成され、QAccessibleAction
オブジェクトに関連付けられます。QWidget
オブジェクトが作成され、QAccessibleInterface
オブジェクトに関連付けられます。QWidget
オブジェクトが表示されます。- ユーザーが
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()
を明示的に呼び出す前に、オブジェクトがまだ使用されていないことを確認する必要があります。