qt/X11使窗口没有边框并且不在任务栏里显示
2007-05-01 21:52
661 查看
最近想弄一些widgets出来,突然遇到这样的大问题。这里给出了解决方案,方案是基于KWin的。不过我在compiz下测试成功,原理其实很简单,我们知道,如果KWin下可以使窗口不在任务栏里显示,那么在metacity,compiz等等窗口管理器下也是没有任务栏项(taskbar entry)的。
窗口的透明需要在QWidget的构造函数里面调用QWidget的构造函数实现,而直接通过setWFlags则就算设置了也没效果。使用Qt::WStyle_NoBorder | Qt:WStyle_Customize。
在下面的代码当中,MainForm继承自MainFormBase,而MainFormBase是一个用Qt Designer生成的一个QWidget的子类。而这个MainForm我创建多几个效果也是一样的,每一个都没有任务栏项。而主程序使用QApplication就可以了。
MainForm::MainForm(QWidget *parent, const char *name)
:MainFormBase(parent, name,
Qt::WStyle_NoBorder | Qt::WStyle_Customize // <--- set flags here
)
...{
// do not set flags here, otherwise it doesn't work
// the code below is to let the window have no taskbar entry
Atom net_wm_state_skip_taskbar=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_TASKBAR", False);
Atom net_wm_state = XInternAtom (qt_xdisplay(),
"_NET_WM_STATE", False);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_taskbar, 1);
}
另外,这几个头文件也是必须的:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
感谢为我提供思路的Stefan。
另外,这个网址的内容可以参考:http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2511406
后记:其实是我搞错了,上面的方法是X11的方法,而不是专门KWin的。如果是专门KWin,那么可以专门用这方法:
KWin::setState( winId(), NET::SkipTaskbar || NET::SkipPager )
在没有在taskbar显示的同时,我们还希望不在pager里面显示。
MainForm::MainForm(QWidget *parent, const char *name)
:MainFormBase(parent, name,
Qt::WStyle_NoBorder | Qt::WStyle_Customize // <--- set flags here
)
...{
// do not set flags here, otherwise it doesn't work
// the code below is to let the window have no taskbar entry and not display in the pager
Atom net_wm_state_skip_taskbar=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_TASKBAR", False);
Atom net_wm_state_skip_pager=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_PAGER", False);
Atom net_wm_state = XInternAtom (qt_xdisplay(),
"_NET_WM_STATE", False);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_taskbar, 1);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_pager, 1);
}
感谢Aaron J. Seigo和John Tapsell的指导。
窗口的透明需要在QWidget的构造函数里面调用QWidget的构造函数实现,而直接通过setWFlags则就算设置了也没效果。使用Qt::WStyle_NoBorder | Qt:WStyle_Customize。
在下面的代码当中,MainForm继承自MainFormBase,而MainFormBase是一个用Qt Designer生成的一个QWidget的子类。而这个MainForm我创建多几个效果也是一样的,每一个都没有任务栏项。而主程序使用QApplication就可以了。
MainForm::MainForm(QWidget *parent, const char *name)
:MainFormBase(parent, name,
Qt::WStyle_NoBorder | Qt::WStyle_Customize // <--- set flags here
)
...{
// do not set flags here, otherwise it doesn't work
// the code below is to let the window have no taskbar entry
Atom net_wm_state_skip_taskbar=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_TASKBAR", False);
Atom net_wm_state = XInternAtom (qt_xdisplay(),
"_NET_WM_STATE", False);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_taskbar, 1);
}
另外,这几个头文件也是必须的:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
感谢为我提供思路的Stefan。
另外,这个网址的内容可以参考:http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2511406
后记:其实是我搞错了,上面的方法是X11的方法,而不是专门KWin的。如果是专门KWin,那么可以专门用这方法:
KWin::setState( winId(), NET::SkipTaskbar || NET::SkipPager )
在没有在taskbar显示的同时,我们还希望不在pager里面显示。
MainForm::MainForm(QWidget *parent, const char *name)
:MainFormBase(parent, name,
Qt::WStyle_NoBorder | Qt::WStyle_Customize // <--- set flags here
)
...{
// do not set flags here, otherwise it doesn't work
// the code below is to let the window have no taskbar entry and not display in the pager
Atom net_wm_state_skip_taskbar=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_TASKBAR", False);
Atom net_wm_state_skip_pager=XInternAtom (qt_xdisplay(),
"_NET_WM_STATE_SKIP_PAGER", False);
Atom net_wm_state = XInternAtom (qt_xdisplay(),
"_NET_WM_STATE", False);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_taskbar, 1);
XChangeProperty (qt_xdisplay(), winId(), net_wm_state,
XA_ATOM, 32, PropModeAppend,
(unsigned char *)&net_wm_state_skip_pager, 1);
}
感谢Aaron J. Seigo和John Tapsell的指导。
相关文章推荐
- QT4中创建不在任务栏显示的窗口.
- PyQt之自定义无边框窗口遮盖任务栏显示问题
- 使窗口不在任务栏上显示(利用ITaskbarList接口)
- 让弹出窗口在屏幕中间显示,没有滚动条,并且点击某行,窗口大小不变化.
- 使运行的窗口不在任务栏显示
- 如何使对话框程序启动以及主窗口最小化时不在任务栏上显示
- MFC窗口程序启动时最小化到托盘、不在任务栏中显示、显示时在右小角
- 打开窗口后为什么任务栏上没有显示
- 创建吸附窗口且不在任务栏显示的方法和思路
- EXECL打开多个文件时不在任务栏上只显示一个文件窗口
- 如何使对话框程序启动以及主窗口最小化时不在任务栏上显示
- 《转》PyQt之自定义无边框窗口遮盖任务栏显示问题
- 创建windows窗口后没有显示(DefWindowProc)
- 将form提交到一个没有边框的弹出窗口中
- "ubuntu 下 eclipse 代码提示功能显示后焦点不在eclipse内,需点击窗口才行 “ 问题的解决
- VC----文件图标和窗口图标及在任务栏显示的图标
- VC 多文档窗口 子窗口最大化时切换窗口 窗口没有最大化显示的问题
- 在opencv中显示无边框的窗口
- (转)用eclipse创建一个j2ee的web工程后,左面projects窗口中的项目如何没有显示webRoot文件夹,除了src的文件夹,其他都不显示
- xp系统重绘边框线不显示(首次加载没有触发paint事件)