1

我在 Qt 5.9.1 上。

我正在尝试使应用程序可以通过屏幕阅读器访问。我有一个自定义小部件(我们称之为MyWidget),其中包含文本(很多)。文本是使用 绘制的QPainter,这就是为什么使用自定义小部件而不是类似QTextBrowser.

我在派生自和的类中QAccessibleTextInterface为小部件实现了。它适用于 Linux 下的 Orca,但在带有 NVDA 的 Windows 7 中使用时,请求错误的接口类型。使用 Orca,我收到了对. 在 NVDA 中,它始终是.AccessibleMyWidgetQAccessibleWidgetQAccessibleTextInterfaceQAccessibleInterface::interface_cast()QAccessible::TextInterfaceQAccessible::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在这一点上它基本上变成了一个,但是有大量的文本,因此很难使用。

我在这里想念什么?

4

1 回答 1

1

嗯,一位 NVDA 开发人员帮助我找到了问题所在。这是因为 Qt 的 MinGW 版本禁用了 IAccessible2 并改用 MSAA(Microsoft Active Accessibility),它不支持任何这些接口。IA2 需要 COM,而 MinGW 不支持。

所以我必须从 GCC/MinGW 切换到 MSVC 才能在 Windows 上完成这项工作。太糟糕了,在可预见的未来这实际上不是一个选择:-/

2020 年更新:
此后此问题已得到修复。不确定确切的时间,但当前的 mingw Qt 版本现在支持这一点。

于 2017-07-08T10:16:02.250 回答