我使用的是Qt 5.9.1。

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

我在从QAccessibleTextInterfaceAccessibleMyWidget派生的QAccessibleWidget类中为小部件实现了QAccessibleTextInterface。它在Linux下的Orca上可以正常使用,但是在Windows 7中与NVDA一起使用时,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上进行此工作。太糟糕了,在可预见的将来,这实际上不是一个选择:-/
2020更新:
此后已修复。不确定确切的时间,但是当前的mingw Qt构建现在支持此功能。

关于c++ - NVDA屏幕阅读器请求错误的QAccessible::InterfaceType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44899048/

10-10 05:50