我在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
,但是有大量文本和因此非常難以使用。
我在這裏錯過了什麼?