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

标签 c++ qt accessibility screen-readers nvda

我在 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/

相关文章:

java - 从C++到Java的转换(在java中返回多个值)

c++ - MSVC 如何优化静态变量的使用?

qt - QT on Symbian 如何设置应用程序图标?

qt - 为 Qt 注册自定义类型时,何时、何地以及为何使用命名空间

javascript - 区分鼠标 "click"和屏幕阅读器 "Press"

asp.net - 自动辅助功能测试/屏幕阅读器模拟器

c++ - 在给定链表中的节点地址的情况下获取节点的地址

c++ - cuda中每个 block 一个线程

qt - 如何在 QJsonArray 中使用基于 C++11 范围的 for

javascript - 非拉丁字母键盘上的键盘快捷键/命令 (JavaScript)