Qt - 有没有办法检查窗口是否标记为always-on-top(linux)?

时间:2018-03-26 07:17:28

标签: c++ qt

有没有办法检查Qt窗口是否标记为始终在顶部(由用户)?我想在closeEvent()上检查它,并在下次用户打开窗口时保存它。

P.S:我检查windowFlags希望设置Qt.WindowStaysOnTopHint标志,但标志似乎不会受到影响。

1 个答案:

答案 0 :(得分:1)

使用xlib,可以调用XGetWindowProperty函数来检查所需的窗口状态提示。

首先检查必要条件,例如sudo apt-get install libx11-dev

pro文件中,链接xlib并要求x11extras qt模块。

QT += x11extras
LIBS += -lX11

这是一个工作示例,如果传入的小部件指针指向 always-on-top 窗口,则返回true的函数:

#include <X11/Xlib.h>
#include <QtX11Extras/QX11Info>

bool isAlwaysOnTop(QWidget * widget)
{
    Atom atr;
    int  afr;
    unsigned long items;
    unsigned long bytes;
    unsigned char *data;

    Display * display = QX11Info::display();
    Atom property = XInternAtom(display, "_NET_WM_STATE", False);
    if(XGetWindowProperty(display, widget->winId(), property, 0L, 1L, False, 4, &atr, &afr, &items, &bytes, &data) == 0)
    {
        Atom abv = XInternAtom(display, "_NET_WM_STATE_ABOVE", False);
        Atom res = reinterpret_cast<Atom *>(data)[0];
        return (res==abv);
    }
    return false;
}

可以在小部件closeEvent内部使用:

void Form::closeEvent(QCloseEvent *)
{
    qDebug() << isAlwaysOnTop(this);
}