當前桌面上我尋找一種方法,把Qt應用程序中的一個QWidget窗口總在當前桌面/工作區。 當我更改虛擬桌面時,我需要在新的當前虛擬桌面上自動顯示我的窗口。保持一個應用程序窗口總在Linux和Mac
我搜索,在最低限度上GNOME,KDE工作在Linux和Mac OS的解決方案。
我認爲第一步是檢測時,虛擬桌面的變化,我不知道,如果Qt的有一個API爲,或者如果我需要實現它的每個桌面解決方案。
在此先感謝您的幫助。
當前桌面上我尋找一種方法,把Qt應用程序中的一個QWidget窗口總在當前桌面/工作區。 當我更改虛擬桌面時,我需要在新的當前虛擬桌面上自動顯示我的窗口。保持一個應用程序窗口總在Linux和Mac
我搜索,在最低限度上GNOME,KDE工作在Linux和Mac OS的解決方案。
我認爲第一步是檢測時,虛擬桌面的變化,我不知道,如果Qt的有一個API爲,或者如果我需要實現它的每個桌面解決方案。
在此先感謝您的幫助。
感謝揚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
}
看起來'data'是QWidget的私人成員,不能被子類訪問。 –
在X11,你應該set the _NET_WM_DESKTOP
window property to 0xFFFFFFFF
。我懷疑有沒有Qt的API爲這一點,所以你必須用垃圾#ifdef
清查的X11代碼,並調用相應的X的功能(不,我不知道它是哪一個)。
謝謝你,Jan爲你提供幫助。我將嘗試使用XChangeProperty(X11/Xlib.h)來設置Qt4.8和QT5.1中的windows屬性和QX11Info以訪問X11數據。完成後我會發布解決方案。 –
我確實希望你有這樣做的充分理由,因爲如果應用程序開始在我的桌面上追逐我,這可能會非常煩人。我使用虛擬桌面的主要原因是每個窗口都有「不同」的窗口。 – Viv
這是一個小型的透明小工具,可以記住您的實際任務,並且需要始終可見,永遠不會忘記實際任務(如同伴)。 –