2013-05-27 39 views
3

當前桌面上我尋找一種方法,把Qt應用程序中的一個QWidget窗口總在當前桌面/工作區。 當我更改虛擬桌面時,我需要在新的當前虛擬桌面上自動顯示我的窗口。保持一個應用程序窗口總在Linux和Mac

我搜索,在最低限度上GNOME,KDE工作在Linux和Mac OS的解決方案。

我認爲第一步是檢測時,虛擬桌面的變化,我不知道,如果Qt的有一個API爲,或者如果我需要實現它的每個桌面解決方案。

在此先感謝您的幫助。

+1

我確實希望你有這樣做的充分理由,因爲如果應用程序開始在我的桌面上追逐我,這可能會非常煩人。我使用虛擬桌面的主要原因是每個窗口都有「不同」的窗口。 – Viv

+0

這是一個小型的透明小工具,可以記住您的實際任務,並且需要始終可見,永遠不會忘記實際任務(如同伴)。 –

回答

2

感謝揚Kundrát他的幫助(上一頁評論https://stackoverflow.com/a/16777496/1045832)。

爲Linux X11解決方案:

#ifdef Q_WS_X11 //only define on Qt 4.X 
#include <QX11Info> //Only on Qt 4.X , return expected in Qt 5.1 
#include <X11/Xlib.h> 
#include <X11/Xatom.h> 
#endif 

YourWidget::YourWidget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::YourWidget) 
{ 

#ifdef Q_WS_X11 //only define on Qt 4.X 
    unsigned long data = 0xFFFFFFFF; 
    XChangeProperty (QX11Info::display(), 
        winId(), 
        XInternAtom(QX11Info::display(), "_NET_WM_DESKTOP", False), 
        XA_CARDINAL, 
        32, 
        PropModeReplace, 
        reinterpret_cast<unsigned char *>(&data), // all desktop 
        1); 
#endif 
} 

將這個在你的.pro

unix:!macx { 
    LIBS += -lX11 
} 

解決方案的MacOS X:

#include <objc/objc-runtime.h> 

WId windowObject = this->winId(); 
objc_object * nsviewObject = reinterpret_cast<objc_object *>(windowObject); 
objc_object * nsWindowObject = objc_msgSend(nsviewObject, sel_registerName("window")); 
int NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0; 
objc_msgSend(nsWindowObject, sel_registerName("setCollectionBehavior:"), NSWindowCollectionBehaviorCanJoinAllSpaces); 

將這個在你的.pro

macx { 
    LIBS += -lobjc 
} 
+0

看起來'data'是QWidget的私人成員,不能被子類訪問。 –

4

在X11,你應該set the _NET_WM_DESKTOP window property to 0xFFFFFFFF。我懷疑有沒有Qt的API爲這一點,所以你必須用垃圾#ifdef清查的X11代碼,並調用相應的X的功能(不,我不知道它是哪一個)。

+1

謝謝你,Jan爲你提供幫助。我將嘗試使用XChangeProperty(X11/Xlib.h)來設置Qt4.8和QT5.1中的windows屬性和QX11Info以訪問X11數據。完成後我會發布解決方案。 –

相關問題