Программа чтения с экрана NVDA запрашивает неверный QAccessible :: InterfaceType

Я на Qt 5.9.1.

Я пытаюсь сделать приложение доступным через программы чтения с экрана. У меня есть собственный виджет (давайте назовем его MyWidget) который содержит текст ( много об этом.) Текст рисуется с использованием QPainter, поэтому используется пользовательский виджет, а не что-то вроде QTextBrowser,

Я реализовал QAccessibleTextInterface для виджета в AccessibleMyWidget класс, который происходит от QAccessibleWidget а также QAccessibleTextInterface, Он отлично работает с Orca под Linux, но при использовании в Windows 7 с NVDA, QAccessibleInterface::interface_cast() запрашивает неправильный тип интерфейса. С 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.
};

С Orca под Linux, кажется, все работает как задумано. Мне звонят interface_cast() для TextInterfaceи после этого различные функции QAccessibleTextInterface называются. С NVDA под Linux я просто получаю interface_cast() призывает для ValueInterfaceи ни один из QAccessibleTextInterface функции называются. Что значит MyWidget полностью недоступен, если я не переопределить QAccessibleWidget::text() и просто вернуть весь текст в виде одной строки, что означает отсутствие навигации курсора, поддержки выбора … Это в основном становится просто QLabel на данный момент, но с тонной текста и, следовательно, очень трудно использовать.

Что мне здесь не хватает?

0

Решение

Ну, разработчик NVDA помог мне отследить проблему. Это связано с тем, что в версии Qt для MinGW IAccessible2 отключен и вместо нее используется MSAA (Microsoft Active Accessibility), которая не поддерживает ни один из этих интерфейсов. IA2 нужен COM, а MinGW этого не поддерживает.

Поэтому я должен был бы переключиться с GCC / MinGW на MSVC, чтобы это работало в Windows. Жаль, что на самом деле это не вариант в обозримом будущем: — /

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]