我搜索一种将Qt应用程序的QWidget窗口始终放在当前桌面/工作区上的方法。 当我更改虚拟桌面时,我需要在新的当前虚拟桌面上自动显示我的窗口。
我搜索一个至少在gnome上运行的解决方案,在linux和mac os上搜索kde。
我认为第一步是检测虚拟桌面何时发生变化,我不知道Qt是否有API,或者我是否需要为每个桌面解决方案实施它。
提前感谢您的帮助。
答案 0 :(得分:4)
在X11下,你应该set the _NET_WM_DESKTOP
window property to 0xFFFFFFFF
。我怀疑没有Qt API,所以你必须在#ifdef
检查X11时调用代码并调用适当的X函数(不,我不知道它是哪一个)。
答案 1 :(得分:3)
感谢JanKundrá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
}