3

Qt アプリケーションの QWidget ウィンドウを常に現在のデスクトップ/ワークスペースに配置する方法を探しています。仮想デスクトップを変更するとき、新しい現在の仮想デスクトップに自分のウィンドウが自動的に表示されるようにする必要があります。

LinuxおよびMac OSのgnome、kdeで少なくとも機能するソリューションを検索します。

最初のステップは、仮想デスクトップがいつ変更されたかを検出することだと思います.QtにそのためのAPIがあるかどうか、またはデスクトップソリューションごとに実装する必要があるかどうかはわかりません.

すべての助けを前もって感謝します。

4

2 に答える 2

4

X11 では、window プロパティをに設定する_NET_WM_DESKTOP0xFFFFFFFF必要があります。そのための Qt API はないと思われるので、#ifdefX11 をチェックする s でコードを散らかし、適切な X の関数を呼び出す必要があります (いいえ、どれかわかりません)。

于 2013-05-27T16:56:01.640 に答える
3

Jan 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
}
于 2013-06-02T12:21:24.223 に答える