Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含可访问性API不可见的QMdiArea的qmdiab窗口_C++_Windows_Qt_Accessibility - Fatal编程技术网

C++ 包含可访问性API不可见的QMdiArea的qmdiab窗口

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定义的可访问性接口,所以我不明白当

我正在使用一个Qt应用程序,并试图通过可访问性界面实现UI自动化。除了此应用程序有一个包含
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。