2017-07-04 6 views
0

私はQt 5.9.1を使用しています。NVDAスクリーンリーダーが間違った要求をするQAccessible :: InterfaceType

私はスクリーンリーダーを通してアプリケーションにアクセスできるようにしようとしています。テキスト(lot)を含むカスタムウィジェット(MyWidgetとしましょう)があります。テキストは、QTextBrowserではなくカスタムのウィジェットが使用されている理由で、QPainterを使用して描画されます。

QAccessibleWidgetQAccessibleTextInterfaceに由来する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になります非常に使いにくいです。

私はここで何が欠けていますか?

答えて

0

NVDAの開発者が問題を追跡するのに役立ちました。 QtのMinGWバージョンではIAccessible2が無効になっており、代わりにこれらのインターフェイスをサポートしていないMSAA(Microsoft Active Accessibility)が使用されているためです。 IA2はCOMを必要とし、MinGWはそれをサポートしていません。

Windowsでこの作業を行うには、GCC/MinGWからMSVCに切り替える必要があります。あまりにも悪いことは、近い将来に実際には選択肢ではありません: -/

関連する問題