qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

窗口置顶
qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)
kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)
这样的置顶窗口不会处于全屏窗口的上方,如果需要真正的置顶,setWindowFlags(Qt::X11BypassWindowManagerHint) 可无视这个规则,但这样不会出现任务栏等,kimtoy 的预编辑窗口就是真正的置顶。

真透明

qt 里是 setAttribute(Qt::WA_TranslucentBackground, true)
真透明需要窗口管理器开启混成,否则透明区域将显示为黑色,这时候可以用非矩形来抠去黑色区域。


背景模糊

kde 扩展 Plasma::WindowEffects::enableBlurBehind(winId(), true, /*这里有个参数指定模糊区域*/)
背景模糊需要窗口管理器开启模糊特效,否则无效。kde kwin 的扩展标识,其它桌面上可能没有模糊效果。


非矩形

qt 里是 setMask(/*这里有个参数指定非矩形区域*/)
没有开桌面混成的时候达到没有黑色区域的效果,形状复杂的话相当消耗资源,使用非透明区域作为形状会产生边缘锯齿。

跳过任务栏分页器
kde 里是 KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager)
这样的窗口经过隐藏再显示出来时,如果程序其它对话框弹出,原先设置跳过任务栏分页器的窗口将失效。解决办法是实现 showEvent(QShowEvent* event) 中再次调用一下。kimtoy 的状态栏窗口在弹出关于kimtoy对话框或者设置对话框后就不能跳过任务栏分页器的,即通过此法解决,krunner也是这样的。

无边框
qt 里是 setWindowFlags(Qt::FramelessWindowHint)
实际上只要能获得焦点,ctrl+f3 打开kwin的菜单还能还原的哦,比如krunner,很多plasmiod。。


无焦点点击

qt 里是 setAttribute(Qt::WA_X11DoNotAcceptFocus, true)
无焦点点击的意思是用鼠标在窗口上进行操作而不将键盘输入的焦点转移到窗口中。kimtoy 的状态栏窗口就是这样子,鼠标可以切换功能,但输入法的各个状态依然是输入焦点窗口而非 kimtoy 状态栏窗口的,这样可实现真正的 Dock。

焦点穿透
很遗憾qt没有这个函数只好直接用x11shape的 XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded)

焦点穿透的意思是所有鼠标键盘操作全部会穿透窗口到下方窗口。有个 Qt::WA_TransparentForMouseEvents 可以对子部件实现,而窗口本身不行。kimtoy 没用到这个,不过很多 osd 桌面歌词程序经常用,网上找了下只有 gdk 的实现,于是就把 qt 的写在这里啦。

本文章转自http://blog.csdn.net/outmanlee/article/details/7451097

QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透的更多相关文章

  1. QT 窗口置顶功能

    Qt中,保持窗口置顶的设置为: Qt::WindowFlags m_flags = windowFlags(); setWindowFlags(m_flags | Qt::WindowStaysOnT ...

  2. 解析Delphi 窗口置顶,及非主窗口置顶

    方法一: procedure TForm1.Button2Click(Sender: TObject);begin Form2.Show; Application.NormalizeTopMosts; ...

  3. 窗口置顶 - 仿TopWind

    前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...

  4. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  5. 将窗口置顶的方法:SetWindowPos、AttachThreadInput、SwitchToThisWindow

    将窗口置顶的方法:SetWindowPos.AttachThreadInput.SwitchToThisWindow [转]http://hi.baidu.com/neil_danky/item/f9 ...

  6. vc 使窗口置顶 在最前面

    bool SetWindowTop(CWnd* pWnd){ if(!pWnd) {   return false; } if(pWnd->GetExStyle()&WS_EX_TOPM ...

  7. win应用只允许单个实例运行,并将已运行实例窗口置顶

    关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...

  8. 取消VS2017窗口置顶

    今天打开VS2017,莫名其妙窗口置顶了,百度了一下如何取消窗口置顶,就是Ctrl+Alt+Esc组合键,就可以取消窗口置顶了,至于到底怎么会突然置顶的我也不知道emmm... /********** ...

  9. FMX 窗口置顶 或置底 xe10

    FMX 窗口置顶  或置底 xe10 Popup 置底 StayOnTop 置顶

随机推荐

  1. 射频识别技术漫谈(18)——Mifare Desfire

    Mifare  DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...

  2. PhoneGap 3.0 安装

    PhoneGap 3.0  已经出来有一段时间了.3.0 提供了使用Node.js 安装,使用命令行创建.编译.运行项目.也就是可以抛弃eclipse,完全使用命令.记事本开发phonegap 项目了 ...

  3. iOS 基于Socket 的 C/S 网络通信结构(下一个)

    以前实现简单 Server 程序,服务端通过 void WriteStreamClientCallBack(CFWriteStreamRef stream, CFStreamEventType eve ...

  4. 用nodejs安装hexo,将hexo部署到github

    跌跌撞撞写这篇博文,希望下一篇可以好点 运行环境:最新版本的nodejs + git 安装好nodejs 和 git ,注册好github账号,新建仓库****.github.io(****为gith ...

  5. CSS3属性值之box-shadow

    语法:   box-shadow:inset x-offset y-offset blur-radius spread-radius color 也就是:   对象选择器 {box-shadow:投影 ...

  6. ajax的简单操作

    项目需要,简单研究了下ajax 需要在html中引入js文件 编写js函数 function testAjax() { $.ajax({ type: 'get', //请求方式 get/post ur ...

  7. Oracle定时器调用存储过程

    1. 创建表 create table job_table(run_time date); 2. 创建存储过程 create or replace procedure job_proc is begi ...

  8. iOS开发 点击跳转到App Store 或者 点击按钮去评价

    //跳转到应用页面 NSString *str = [NSString stringWithFormat:@"http://itunes.apple.com/us/app/id%d" ...

  9. wpf将表中数据显示到datagrid示例(转)

    原文:http://www.jb51.net/article/47120.htm 这篇文章主要介绍了wpf将表中数据显示到datagrid示例,需要的朋友可以参考下 a.在.xaml文件中拖入一个da ...

  10. TCP粘包和半包的处理方法

    先把处理的方法的代码放这里: 解析数据帧的代码: bool CSocket::findData(byte* buff, int& len) { for (int i = 0; i <= ...