2015-01-16 81 views
2

我正在開發應用程序工具欄在QT 4.8.5(這個版本是我的客戶端必需的)SLED 11. 我也在一個多監視器環境。QT 4.8.5 - 彈出式菜單顯示在錯誤的地方 - SLED 11

我的目的是在指定的顯示器上顯示擴展工具欄,在其他顯示器上顯示縮小的工具欄。 從主工具欄可以打開安裝在系統中的不同應用程序。這些應用程序可以是QT或不是。

爲了使xserver能夠將工具欄作爲對接窗口處理並在桌面上保留空間(所以其他窗口無法在工具欄上移動並使窗口最大化不在工具欄上)我使用了一些xlib調用。

這是我保留的空間的方式:

void ToolbarWindow::dock(int x, int y, int width, int height) 
{ 

#ifdef Q_WS_X11 //only define on Qt 4.X 

    Display *display = QX11Info::display(); 

    // Change the window type in order to make it DOCK. 
    Atom tmp = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False); 
    XChangeProperty(display, 
       winId(), 
       XInternAtom(display, "_NET_WM_WINDOW_TYPE", False), 
       XA_ATOM , 
       32, 
       PropModeReplace, 
       (unsigned char *)&tmp, 1); 

    // Reserve the space. 
    // [0]left, [1]right, [2]top, [3]bottom, [4]left_start_y, [5]left_end_y, [6]right_start_y, [7]right_end_y, [8]top_start_x, [9]top_end_x, [10]bottom_start_x, [11]bottom_end_x 
    long insets[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    insets[2] = height; 
    insets[8] = x; 
    insets[9] = x+width; 

    XChangeProperty(display, 
       winId(), 
       XInternAtom(display, "_NET_WM_STRUT", False), 
       XA_CARDINAL , 
       32, 
       PropModeReplace, 
       (unsigned char *)&insets, 4); 

    XChangeProperty(display, 
       winId(), 
       XInternAtom(display, "_NET_WM_STRUT_PARTIAL", False), 
       XA_CARDINAL , 
       32, 
       PropModeReplace, 
       (unsigned char *)&insets, 12); 

#endif 

} 

一切似乎都做工精細,但一些測試後,我曾與QT下拉菜單中的一個大問題。 看來,當QT計算下拉的位置時,會考慮獨立於窗口監視器的最大保留高度。

這裏有兩個圖像顯示問題。

第一張圖片顯示即使在QTCreator下拉菜單中也可以測試該問題。 Dropdown problem on QTCreator

第二張圖片顯示了我爲了看看在自定義QMainWindow上的組合框下拉菜單上發生了什麼。 這個問題似乎是一樣的。

Dropdown problem on QT window

我還可以添加移動主工具欄的第二監視器上的高度下方的窗口的下拉位置是正確的。 此外,其他非QT應用程序不會有這種行爲,所以我認爲這是一個QT 4.8.5問題在下拉定位。

我也發現有關Mac OS X上類似的錯誤 我不知道,如果這些錯誤可能是有意義的,但我無論如何都將一一列舉:

任何人都可以幫我找出解決這個問題的辦法嗎?

非常感謝。

回答