2017-07-04 144 views
0

我在Qt 5.9.1上。NVDA屏幕閱讀器請求錯誤QAccessible :: InterfaceType

我正試圖通過屏幕閱讀器訪問應用程序。我有一個包含文本(lot)的自定義小部件(我們稱之爲MyWidget)。文本使用QPainter繪製,這就是爲什麼使用自定義小部件而不是像QTextBrowser之類的東西。

我在和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. 
}; 

隨着海怪,似乎一切都按預期工作。我撥打interface_cast()撥打TextInterface,然後調用QAccessibleTextInterface的各種功能。使用Linux下的NVDA,我只需要調用ValueInterface,並且不調用QAccessibleTextInterface函數。這意味着MyWidget是完全無法訪問的,除非我重寫QAccessibleWidget::text()並將所有文本作爲單個字符串返回,這意味着沒有光標導航,沒有選擇支持......現在它基本上變成了QLabel,但是有大量文本和因此非常難以使用。

我在這裏錯過了什麼?

回答

0

那麼,NVDA的開發者幫助我追蹤了這個問題。這是因爲QG的MinGW版本禁用了IAccessible2並且使用MSAA(Microsoft Active Accessibility),而不支持任何這些接口。 IA2需要COM,MinGW不支持。

因此,我將不得不從GCC/MinGW切換到MSVC,使這項工作在Windows上。太糟糕了,在可預見的未來,這實際上不是一種選擇: -/