我在 Qt 5.9.1 上。
我正在尝试使应用程序可以通过屏幕阅读器访问。我有一个自定义小部件(我们称之为MyWidget
),其中包含文本(很多)。文本是使用 绘制的QPainter
,这就是为什么使用自定义小部件而不是类似QTextBrowser
.
我在派生自和的类中QAccessibleTextInterface
为小部件实现了。它适用于 Linux 下的 Orca,但在带有 NVDA 的 Windows 7 中使用时,请求错误的接口类型。使用 Orca,我收到了对. 在 NVDA 中,它始终是.AccessibleMyWidget
QAccessibleWidget
QAccessibleTextInterface
QAccessibleInterface::interface_cast()
QAccessible::TextInterface
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()
for a 的电话TextInterface
,然后调用了 of 的各种功能QAccessibleTextInterface
。使用 Linux 下的 NVDA,我只收到interface_cast()
的调用ValueInterface
,并且没有调用任何QAccessibleTextInterface
函数。这意味着MyWidget
完全无法访问,除非我覆盖QAccessibleWidget::text()
并将所有文本作为单个字符串返回,这意味着没有光标导航,没有选择支持......QLabel
在这一点上它基本上变成了一个,但是有大量的文本,因此很难使用。
我在这里想念什么?