2010-08-24 41 views
6

(見編輯)如何防止Gnome在執行alt-tab時顯示兩個窗口? (C++ QT應用程序)

我正在開發下一個GNOME的QT/C++應用程序。

應用程序主窗口和QListBox子窗口。

當我從應用程序中遠離標籤時,這兩個窗口都顯示爲單獨的主窗口。

我該如何做到這一點,以便我(或以後的用戶)使用alt-tab時只顯示一個窗口?

我猜這種行爲來是因爲一個主窗口不剪輯子窗口 - 子窗口擴展主窗口的邊界。 Gnome對於其他許多應用程序也有不良的alt-tab行爲,與主窗口分開顯示模式對話框。但在我的應用程序的情況下,這真的很煩人。

我想我可以做一個巨大的透明窗口,包括兩個現有的窗口。但找到一個「乾淨」的解決方案會更好。

(最合乎邏輯的猜測是真的,它有事情做與窗口標誌我已經試過標誌的每一個合理的組合,我能想到的窗口類型描述here

編輯: 的應用程序有一個QWidget作爲其主窗口(Not QMainWindow),QListView包含在QWidget對象中,並通過將一個點傳遞給主窗口來創建。 使用Qt :: Tool |進行設計Qt的:: FramelessWindowHint。

EDIT2: Qt的:: X11BypassWindowManagerHint風格確實工作,從使用Alt-Tab列表中刪除的窗口。問題是它也使得窗口「不受管理」,因此它覆蓋了其他窗口。每當我失去焦點時,我都可以隱藏起來 - 現在獎勵更好的解決方案。

+1

我猜它與窗口標誌有關......例如,如果你將它做成了一個工具窗口,它會抓住兩個呢?例如,當我使用開放式辦公室時,gnome不會通過其浮動工具窗口進行選項卡,而只會選擇主窗口。 – 2010-08-24 13:59:15

+0

我假設QListBox的父窗口指針設置爲QMainWindow?任何機會在最低限度所需的代碼框架來產生這個問題? – sleepynate 2010-08-30 13:23:06

回答

3

在爲您的QListBox窗口創建窗口時,在其構造函數中設置了一個Qt::Tool窗口標誌,或者在之後使用setWindowFlags函數調用。下面是一些代碼片段(我省略了頭):

 
int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 
    QMainWindow mw; 
    mw.show(); 
    QWidget toolWindow(&mw, Qt::Window|Qt::Tool); 
    QHBoxLayout layout(&toolWindow); 
    toolWindow.setLayout(&layout); 
    QListView lv(&toolWindow); 
    layout.addWidget(&lv); 
    toolWindow.show(); 

    return app.exec(); 
}

我已經在我的Debian的SID盒(GNOME 2.30,Metacity的2.30.1)與新創建的用戶測試這個:image proof on answer to question #3553428

如果這不是你想要的,那麼請命名正確運行的軟件,或者你可以自己檢查它。爲此,在終端窗口中運行xprop,然後單擊您感興趣的窗口。輸出將包含窗口標誌。你感興趣的是_NET_WM_WINDOW_TYPE(ATOM)。對於工具窗口(即使用Alt-Tab未上市)這個標誌是:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL 

如果有這些標誌的窗口是不是一個工具箱窗口,然後什麼是錯的與你的窗口管理器或您親自設定這樣的行爲。

+0

那麼,你有唯一的答案 - 問題是,你錯了。我會堅持下去。如果你編輯以反映我的問題中的評論,也許可以授予它... – 2010-09-02 00:01:51

+0

嗯,我認爲解決方案與我的編輯一樣 - 你需要使用Qt :: X11BypassWindowManagerHint樣式來解決所有問題。但是,嘿,如果你遇到了很多麻煩,你比任何人都更近...... – 2010-09-11 04:01:47

+0

但是frickin堆棧溢出可能已經吃掉了獎金,因爲我看不到它們出現。不好。這個地方不是它曾經是... – 2010-09-11 04:02:58

1

您可以使用wmctrl工具手動嘗試。用「-r -b SOMETHING」你可以修改它的NET_WM參數。在[1]中試試這些。

如果這樣可行,您可以使用Xlib-Calls添加它們(如果您瞭解Qt中的X11窗口號。我相信這是可能的)。

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html 
相關問題