Я пытаюсь отправить уведомление в Jaws или NVDA, когда происходят определенные события. Эти события могут произойти в любое время, и любой виджет приложения может иметь фокус. Они связаны не с действиями пользователя, а с событиями контроллера. Это моя попытка:
void announceNewMessageIfNeeded(){
if (QAccessible::isActive()){
QWidget* focusWidget = QApplication::focusWidget();
if (focusWidget != nullptr){
auto* accessibleInterface = QAccessible::queryAccessibleInterface(focusWidget);
accessibleInterface->setText(QAccessible::Name, "New Message");
auto *ev = new QAccessibleEvent(accessibleInterface, QAccessible::Alert);
QAccessible::updateAccessibility(ev);
}
}
}
Я попробовал приведенный выше код с различными небольшими изменениями, но у меня либо нет обновления специальных возможностей, либо нежелательный доступ к нулевым указателям. С журналами отладки я точно знаю, что focusWidget верен (он указывает на элемент, имеющий currentFocus) и что вызывается declareNewMessageIfNeeded. Есть идеи?
решение, которое, кажется, работает:
if (QAccessible::isActive()){
QWidget* focusedWidget = QApplication::focusWidget();
if (focusedWidget != nullptr){
auto *ev = new QAccessibleValueChangeEvent(focusedWidget, "New Message");
QAccessible::updateAccessibility(ev);
}
}
Я не знаю QT, но зная о WXWidgets, я бы сказал, что ваш виджет может не иметь соответствующего доступного интерфейса. Это не обязательно и может даже навредить доступности, если виджет является стандартным WinAPI.