NVDA屏幕阅读器请求错误的QAccessible :: InterfaceType

时间:2017-07-04 07:01:13

标签: c++ qt accessibility screen-readers nvda

我在Qt 5.9.1。

我试图通过屏幕阅读器访问应用程序。我有一个自定义小部件(让我们称之为MyWidget),其中包含文本( lot )。文本使用QPainter绘制,这就是为什么使用自定义窗口小部件而不是QTextBrowser

我为来自QAccessibleTextInterfaceAccessibleMyWidget的{​​{1}}课程中的小部件实施了QAccessibleWidget。它适用于Linux下的Orca,但在Windows 7中使用NVDA时,QAccessibleTextInterface请求错误的接口类型。使用Orca,我收到了QAccessibleInterface::interface_cast()的请求。在NVDA中,它总是QAccessible::TextInterface

QAccessible::ValueInterface定义为:

AccessibleMyWidget

在Linux下使用Orca,一切似乎都按预期工作。我接到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. }; 的{​​{1}}来电话,然后调用interface_cast()的各种功能。使用Linux下的NVDA,我只需TextInterface调用QAccessibleTextInterface,并且不调用任何interface_cast()函数。这意味着ValueInterface完全无法访问,除非我覆盖QAccessibleTextInterface并将所有文本作为单个字符串返回,这意味着没有光标导航,没有选择支持......它基本上变成了{{1}在这一点上,但是有大量的文字,因此很难使用。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

嗯,NVDA开发人员帮助我追踪了这个问题。这是因为Qt的MinGW版本禁用了IAccessible2,而是使用MSAA(Microsoft Active Accessibility),它不支持任何这些接口。 IA2需要COM,而MinGW不支持COM。

所以我必须从GCC / MinGW切换到MSVC才能在Windows上运行。太糟糕了,在可预见的未来实际上并不是一个选择: - /