C++ 包含可访问性API不可见的QMdiArea的qmdiab窗口
我正在使用一个Qt应用程序,并试图通过可访问性界面实现UI自动化。除了此应用程序有一个包含C++ 包含可访问性API不可见的QMdiArea的qmdiab窗口,c++,windows,qt,accessibility,C++,Windows,Qt,Accessibility,我正在使用一个Qt应用程序,并试图通过可访问性界面实现UI自动化。除了此应用程序有一个包含QMdiArea的QMdiSubWindows的QMdiArea,并且这些子窗口中包含的任何内容对自动化界面都是完全不透明的之外,这一切都可以正常工作。我试图通过Windows SDK中的ui平均化检查元素,如下所示: 这些子窗口包含一个标准的网格布局,其中包含标准的Qt小部件。由于heirachy在这里完全由标准的Qt小部件组成,并且所有标准的Qt小部件都实现了MSAA定义的可访问性接口,所以我不明白当
QMdiArea
的QMdiSubWindow
s的QMdiArea,并且这些子窗口中包含的任何内容对自动化界面都是完全不透明的之外,这一切都可以正常工作。我试图通过Windows SDK中的ui平均化
检查元素,如下所示:
这些子窗口包含一个标准的网格布局,其中包含标准的Qt小部件。由于heirachy在这里完全由标准的Qt小部件组成,并且所有标准的Qt小部件都实现了MSAA定义的可访问性接口,所以我不明白当我可以自由访问GUI的所有其他区域中的元素时,为什么MDI区域中的所有元素都被隐藏。可能是因为Qt
没有注册它的属性控件作为有效的windows
。Qt
中的所有控件都绘制在一个画布上。这是出于优化的原因
这样的Qt
控件被调用
好消息是,您可以使Qt
在Windows中注册所有控件。缔约国提出了一些办法:
- 在您的环境中使用QT\u Use\u NATIVE\u WINDOWS=1
- 在应用程序上设置Qt::AA_NativeWindows属性。所有小部件都将是本机小部件
- 在小部件上设置Qt::WA_NativeWindow属性:小部件本身及其所有祖先将成为本机的(除非设置了Qt::WA_DontCreateNativeAncestors)
- 调用QWidget::winId强制执行本机窗口(这意味着3)
- 设置Qt::WA_PaintOnScreen属性以强制使用本机窗口(这意味着3)
第一个是最简单的,不需要重新编译程序
我用UIAVerify
尝试了它,得到了完整的MDI控件树。可能是因为Qt
没有将其控件注册为有效的windows
。Qt
中的所有控件都绘制在一个画布上。这是出于优化的原因
这样的Qt
控件被调用
好消息是,您可以使Qt
在Windows中注册所有控件。缔约国提出了一些办法:
- 在您的环境中使用QT\u Use\u NATIVE\u WINDOWS=1
- 在应用程序上设置Qt::AA_NativeWindows属性。所有小部件都将是本机小部件
- 在小部件上设置Qt::WA_NativeWindow属性:小部件本身及其所有祖先将成为本机的(除非设置了Qt::WA_DontCreateNativeAncestors)
- 调用QWidget::winId强制执行本机窗口(这意味着3)
- 设置Qt::WA_PaintOnScreen属性以强制使用本机窗口(这意味着3)
第一个是最简单的,不需要重新编译程序
我用UIAVerify
尝试了它,得到了一个完整的MDI控件树。谢谢,设置环境变量就足以让它工作了。不过,这看起来仍然像一个bug。谢谢,设置环境变量足以让它工作。不过,这看起来仍然像一个bug。