• 7950阅读
  • 4回复

[提问]如何让无边框透明的窗口保持在最前面? [复制链接]

上一主题 下一主题
离线moiit
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-13

就是怎么做到:frameless && translucent && stay-on-top ==true


似乎在X11上可以做到,参见最下面的程序代码。
另外,我已经试验过,采用win7的API,也能做到这点。
请教如果要在winXP和macOS上实现,该如何做?


用这个的话,可以无边框透明,但不能在最前。
  1. setAttribute(Qt::WA_TranslucentBackground,true);
  2. setWindowFlags(Qt::WindowStaysOnTopHint);
  3. setWindowFlags(Qt::FramelessWindowHint);



用这个的话,能在最前,又不能透明,背景是黑的。
  1. setAttribute(Qt::WA_TranslucentBackground,true);
  2. setWindowFlags(Qt::FramelessWindowHint);
  3. setWindowFlags(Qt::WindowStaysOnTopHint);



现在的问题是,有什么办法可以在不使用Qt::FramelessWindowHint的情况下,做到透明
以下的代码也不行,背景仍然是黑的。


  1. #include <QtGui>
  2. class Widget : public QWidget {
  3. public:
  4.   Widget() : QWidget() {
  5.     setWindowFlags(windowFlags()|Qt::WindowStaysOnTopHint);
  6.     setAttribute(Qt::WA_TranslucentBackground,true);
  7.     //QPalette pal = palette();
  8.     //pal.setColor(QPalette::Background, QColor (0, 0 , 0, 20));
  9.     //setPalette(pal);
  10.   }
  11. protected:
  12.   void paintEvent(QPaintEvent *pe) {
  13.     QPainter p(this);
  14.     p.setBrush(Qt::red);
  15.     p.setRenderHint(QPainter::Antialiasing);
  16.     p.drawEllipse(rect().adjusted(50,50,-50,-50));
  17.   }
  18.   void resizeEvent(QResizeEvent *re) {
  19.     setMask(rect());
  20.   }
  21. };
  22. int main(int argc, char **argv) {
  23.   QApplication app(argc, argv);
  24.   Widget w;
  25.   w.show();
  26.   return app.exec();
  27. }

只看该作者 1楼 发表于: 2011-10-13
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
离线jdwx

只看该作者 2楼 发表于: 2011-10-13
回 楼主(moiit) 的帖子
liunx(ubuntu)要开特效才能透明,默认的不透明,先把桌面特效打开。
我在虚拟机里开不了特效,怎么弄都是漆黑一片,不能透明。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线roywillow

只看该作者 3楼 发表于: 2011-10-13
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
这一句应该无误

想让窗口透明并且有边框好像不好办,我记得之前在win7下带边框然后带上半透明结果就全黑了
不过如果你只是想让窗口半透明的话倒是挺好办……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线moiit

只看该作者 4楼 发表于: 2011-10-13
引用第1楼咖啡猫大人于2011-10-13 19:06发表的  :
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

您一行代码就搞定了,太高了!
在win7里达到了所要的效果,比利用win7的API来实现简洁一百倍。
如果哪位有条件,烦请在winXP和macOS里试一下,是不是同样达到了效果?
谢谢楼上几位,我苦苦实验了一天,现在终于解决了。
快速回复
限100 字节
 
上一个 下一个