QMdiArea, содержащее QMdiSubWindows, невидимое для API доступа

Я работаю с приложением Qt и пытаюсь реализовать автоматизацию пользовательского интерфейса через интерфейс специальных возможностей. Это все работает хорошо, за исключением того факта, что это приложение имеет QMdiArea который содержит QMdiSubWindows и все, что содержится в этих подокнах, полностью непрозрачно для интерфейса автоматизации. Я пытался проверить элементы через UIAVerify из Windows SDK, который показывает следующее:

MDI зона

Эти подокна содержат стандартную сетку, которая содержит стандартные виджеты Qt. Поскольку иерархия здесь целиком состоит из стандартных виджетов Qt, а все стандартные виджеты Qt реализуют интерфейс доступности, как определено MSAA, я не понимаю, почему все элементы в области MDI скрыты, когда я могу свободно обращаться к элементам во всех других областях графического интерфейса пользователя. ,

1

Решение

Вероятно, причина в том, что Qt не регистрирует свои элементы управления как действительные windows, Все элементы управления в Qt нарисованы на одном холсте. Это сделано для оптимизации.

такие Qt элементы управления называются инопланетные виджеты.

Хорошая новость в том, что вы можете сделать Qt зарегистрировать все элементы управления в Windows. документация Укажите несколько способов сделать это:

  • Используйте QT_USE_NATIVE_WINDOWS = 1 в вашей среде.
  • Установите атрибут Qt :: AA_NativeWindows в вашем приложении. Все виджеты будут родными виджетами.
  • Установите атрибут Qt :: WA_NativeWindow для виджетов: сам виджет и все его предки станут нативными (если не установлен Qt :: WA_DontCreateNativeAncestors).
  • Вызовите QWidget :: winId для принудительного применения собственного окна (это подразумевает 3).
  • Установите атрибут Qt :: WA_PaintOnScreen для принудительного применения собственного окна (это подразумевает 3).

Первый — самый простой и не требует перекомпиляции программы.

Я попробовал это с UIAVerify и получил полное дерево элементов управления MDI.

4

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