我使用的是Qt 5.9.1。
我正在尝试通过屏幕阅读器访问应用程序。我有一个包含文本(很多)的自定义窗口小部件(我们称之为MyWidget
)。使用QPainter
绘制文本,这就是为什么使用自定义窗口小部件而不是诸如QTextBrowser
之类的原因。
我在从QAccessibleTextInterface
和AccessibleMyWidget
派生的QAccessibleWidget
类中为小部件实现了QAccessibleTextInterface
。它在Linux下的Orca上可以正常使用,但是在Windows 7中与NVDA一起使用时,QAccessibleInterface::interface_cast()
请求错误的接口(interface)类型。使用Orca,我收到了QAccessible::TextInterface
的请求。在NVDA中,它始终是QAccessible::ValueInterface
。AccessibleMyWidget
定义为:
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.
};
使用Linux下的Orca,一切似乎都能按预期工作。我收到
interface_cast()
的TextInterface
调用,然后调用了QAccessibleTextInterface
的各种功能。在Linux下使用NVDA时,我只收到interface_cast()
的ValueInterface
调用,而没有调用QAccessibleTextInterface
函数。这意味着MyWidget
是完全不可访问的,除非我重写QAccessibleWidget::text()
并仅将所有文本作为单个字符串返回,这意味着没有光标导航,没有选择支持...此时,它基本上只是QLabel
,但是带有大量文本和因此很难使用。我在这里想念什么?
最佳答案
好吧,一个NVDA开发人员帮助我找到了问题所在。这是因为Qt的MinGW版本禁用了IAccessible2,而是改用了MSAA(Microsoft Active Accessibility),它不支持任何这些接口(interface)。 IA2需要COM,而MinGW不支持。
因此,我必须从GCC / MinGW切换到MSVC才能在Windows上进行此工作。太糟糕了,在可预见的将来,这实际上不是一个选择:-/
2020更新:
此后已修复。不确定确切的时间,但是当前的mingw Qt构建现在支持此功能。
关于c++ - NVDA屏幕阅读器请求错误的QAccessible::InterfaceType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44899048/