Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在linux和mac上,将应用程序窗口始终保持在当前桌面上_C++_Qt_Gnome_Kde - Fatal编程技术网

C++ 在linux和mac上,将应用程序窗口始终保持在当前桌面上

C++ 在linux和mac上,将应用程序窗口始终保持在当前桌面上,c++,qt,gnome,kde,C++,Qt,Gnome,Kde,我寻找一种方法,将Qt应用程序的QWidget窗口始终放在当前桌面/工作区上。 当我更改虚拟机时,我需要在新的当前虚拟机上自动显示我的窗口 我搜索的解决方案至少可以在gnome、kde和mac os上运行 我认为第一步是检测虚拟桌面何时发生变化,我不知道Qt是否有用于此的API,或者是否需要为每个桌面解决方案实现它 提前感谢您的帮助。在X11下,您应该这样做。我怀疑Qt API不适用于此,因此您必须在代码中添加#ifdef检查X11并调用适当的X函数(不,我不知道是哪一个)。感谢Jan Kund

我寻找一种方法,将Qt应用程序的QWidget窗口始终放在当前桌面/工作区上。 当我更改虚拟机时,我需要在新的当前虚拟机上自动显示我的窗口

我搜索的解决方案至少可以在gnome、kde和mac os上运行

我认为第一步是检测虚拟桌面何时发生变化,我不知道Qt是否有用于此的API,或者是否需要为每个桌面解决方案实现它


提前感谢您的帮助。

在X11下,您应该这样做。我怀疑Qt API不适用于此,因此您必须在代码中添加
#ifdef
检查X11并调用适当的X函数(不,我不知道是哪一个)。

感谢Jan Kundrát的帮助(之前的评论)

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
}
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);

我真的希望你有充分的理由这样做,因为如果一个应用程序开始在我的桌面上追我,这可能会变得非常烦人。我使用虚拟桌面的主要原因是在每个窗口上都有“不同”的窗口。它是一个小而透明的小部件,用于记住您的实际任务,并且需要始终可见,以便永远不会忘记实际任务(就像一个同伴)。感谢您的帮助。我将尝试使用XChangeProperty(X11/Xlib.h)设置Qt4.8和QT5.1中的windows属性和QX11Info,以便从中访问X11数据。我将在完成后发布解决方案。看起来
data
是QWidget的私有成员,子类无法访问。
#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);
macx {
    LIBS += -lobjc
}