私はQt 5.9.1を使用しています。NVDAスクリーンリーダーが間違った要求をするQAccessible :: InterfaceType
私はスクリーンリーダーを通してアプリケーションにアクセスできるようにしようとしています。テキスト(lot)を含むカスタムウィジェット(MyWidget
としましょう)があります。テキストは、QTextBrowser
ではなくカスタムのウィジェットが使用されている理由で、QPainter
を使用して描画されます。
QAccessibleWidget
とQAccessibleTextInterface
に由来するAccessibleMyWidget
クラスのウィジェットにQAccessibleTextInterface
を実装しました。 LinuxではOrcaとうまく動作しますが、Windows 7でNVDAを使用すると、QAccessibleInterface::interface_cast()
は間違ったインターフェイスタイプを要求します。 Orcaでは、QAccessible::TextInterface
のリクエストを受け取ります。 NVDAでは、常にQAccessible::ValueInterface
です。
AccessibleMyWidget
は次のように定義される:Linuxでオルカで
class AccessibleMyWidget:
public QAccessibleWidget, public QAccessibleTextInterface {
public:
explicit AccessibleMyWidget(QWidget* w)
: QAccessibleWidget(w, QAccessible::EditableText)
{
Q_ASSERT(isValid());
}
void* interface_cast(QAccessible::InterfaceType t) override
{
if (t == QAccessible::TextInterface) {
// !!! This is never requested with NVDA !!!
return static_cast<QAccessibleTextInterface*>(this);
}
return QAccessibleWidget::interface_cast(t);
}
/*
* QAccessibleTextInterface implementation below this point.
*/
void addSelection(int startOffset, int endOffset) override;
QString attributes(int offset, int* startOffset,
int* endOffset) const override;
// etc.
};
、すべてが意図したとおりに動作するようです。私はTextInterface
のためにinterface_cast()
への呼び出しを受け、その後、QAccessibleTextInterface
の様々な機能が呼び出されます。 LinuxでNVDAを使うと、が呼び出され、QAccessibleTextInterface
関数は呼び出されません。interface_cast()
はValueInterface
です。つまり、QAccessibleWidget::text()
をオーバーライドしてすべてのテキストを1つの文字列として返す場合を除き、MyWidget
は完全にアクセスできません。カーソルの移動や選択のサポートがないことを意味します。この時点で基本的にはQLabel
になります非常に使いにくいです。
私はここで何が欠けていますか?