Я на 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
на данный момент, но с тонной текста и, следовательно, очень трудно использовать.
Что мне здесь не хватает?
Ну, разработчик NVDA помог мне отследить проблему. Это связано с тем, что в версии Qt для MinGW IAccessible2 отключен и вместо нее используется MSAA (Microsoft Active Accessibility), которая не поддерживает ни один из этих интерфейсов. IA2 нужен COM, а MinGW этого не поддерживает.
Поэтому я должен был бы переключиться с GCC / MinGW на MSVC, чтобы это работало в Windows. Жаль, что на самом деле это не вариант в обозримом будущем: — /
Других решений пока нет …