我在Qt 5.9.1。
我试图通过屏幕阅读器访问应用程序。我有一个自定义小部件(让我们称之为MyWidget
),其中包含文本( lot )。文本使用QPainter
绘制,这就是为什么使用自定义窗口小部件而不是QTextBrowser
。
我为来自QAccessibleTextInterface
和AccessibleMyWidget
的{{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}在这一点上,但是有大量的文字,因此很难使用。
我在这里缺少什么?
答案 0 :(得分:0)
嗯,NVDA开发人员帮助我追踪了这个问题。这是因为Qt的MinGW版本禁用了IAccessible2,而是使用MSAA(Microsoft Active Accessibility),它不支持任何这些接口。 IA2需要COM,而MinGW不支持COM。
所以我必须从GCC / MinGW切换到MSVC才能在Windows上运行。太糟糕了,在可预见的未来实际上并不是一个选择: - /