2014-10-20 65 views
1

我正在使用Qt應用程序並試圖通過可訪問性接口實現UI自動化。除了這個應用程序有一個QMdiArea,其中包含QMdiSubWindow和這些子窗口中包含的任何內容對自動化接口完全不透明這一事實,這一切都運行良好。我試圖通過檢查從UIAVerify Windows SDK中的元素,顯示如下:包含對可訪問性API不可見的QMdiSubWindows的QMdiArea

MDI area

這些子窗口包含其中包含標準Qt控件標準的網格佈局。由於這裏的heirachy完全由標準的Qt小部件組成,並且所有標準的Qt小部件都實現了MSAA定義的可訪問性接口,所以我不明白爲什麼MDI區域中的所有元素都是隱藏的,因爲我可以自由訪問GUI所有其他區域中的元素。

回答

4

原因可能是Qt未將其控件註冊爲有效的windowsQt中的所有控件都繪製在一個畫布上。這是出於優化原因。

這樣的Qt控件被稱爲alien widgets

好消息是,您可以使Qt註冊Windows中的所有控件。該documentation美國一些方法可以做到這一點:

  • 使用環境中的QT_USE_NATIVE_WINDOWS = 1。
  • 在應用程序中設置Qt :: AA_NativeWindows屬性。所有小部件都將是本地小部件。
  • 在窗口小部件上設置Qt :: WA_NativeWindow屬性:窗口小部件本身及其所有祖先將成爲本地(除非設置了Qt :: WA_DontCreateNativeAncestors)。
  • 調用QWidget :: winId來強制執行一個本地窗口(這意味着3)。
  • 設置Qt :: WA_PaintOnScreen屬性來強制本機窗口(這意味着3)。

第一個是最簡單的,並且不需要重新編譯程序。

我試了UIAVerify並得到了一個完整的MDI控制樹。

+0

謝謝,設置環境變量足以讓它工作。儘管如此,這仍然看起來像一個錯誤。 – sjdowling 2014-10-20 19:21:34

+0

不客氣。 – Ezee 2014-10-21 05:37:21