我在 Qt 5.9.1 上。
我正在尝试使应用程序可以通过屏幕阅读器访问。我有一个自定义小部件(我们称之为 MyWidget
),其中包含文本(很多)。文本是使用 QPainter
绘制的,这就是为什么使用自定义小部件而不是像 QTextBrowser
这样的小部件的原因.
我实现了QAccessibleTextInterface
对于 AccessibleMyWidget
中的小部件派生自 QAccessibleWidget
的类和 QAccessibleTextInterface
.它适用于 Linux 下的 Orca,但在带有 NVDA 的 Windows 7 中使用时,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 上完成这项工作。太糟糕了,在可预见的 future 这实际上不是一个选择:-/
2020年更新:
从那以后,这已得到解决。不确定确切的时间,但当前的 mingw Qt 版本现在支持这一点。
关于c++ - NVDA 屏幕阅读器请求错误的 QAccessible::InterfaceType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44899048/