QT透明的经验汇编

最近在美化QT,一直对纯代码编写和美化界面能力拙急。网上搜了很多很多资料,但由于那个庞大的工程还没完成,先将网上的资料整理一下,有一些没用到的,留着以后看。等我的界面美化完之后再po上来~
/**********************************转载分割线**********************************/
Qt 的一些心得
本文来自:http://blog.csdn.net/lpt19832003/archive/2010/03/15/5381095.aspx

一. 背景刷成黑色,前景色设为白色。 
方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用

点击(此处)折叠或打开

  1. QPalette bgpal = palette();
  2. bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));
  3. //bgpal.setColor (QPalette::Background, Qt::transparent);
  4. bgpal.setColor (QPalette::Foreground, QColor (255,255,255,255)); setPalette (bgpal);

方法二、stylesheet方式 
影响子控件的方法是:

点击(此处)折叠或打开

  1. setStyleSheet ("background-color: rgb(0,0,0);color: rgb(255,255,255);");

不影响子控件的方法是:

点击(此处)折叠或打开

  1. setStyleSheet ("venus--TitleBar {background-color: rgb(0,0,0);color: rgb(255,255,255);}");

点击(此处)折叠或打开

  1. this->setObjectName("pw");// 设置对象句,相当于css里的id
  2. this->setStyleSheet("#pw {border-image: url(:/new/prefix1/Pic/54.png);}");// 设置id对应元素的背景色

二. 圆角控件 用stylesheet方式

点击(此处)折叠或打开

  1. setStyleSheet ("border:2px groove gray;border-radius:10px;padding:2px 4px;");

三. 圆角窗口

点击(此处)折叠或打开

  1. RoundRectWin::RoundRectWin()
  2. {
  3. QPalette p = palette();
  4. QPixmap img("roundrect.png");
  5. QBitmap mask("roundrect_mask.png");
  6. p.setBrush(QPalette::Window, QBrush(img));
  7. setPalette(p);
  8. setMask(mask);
  9. resize(img.size());
  10. //setWindowFlags(Qt::FramelessWindowHint);//这句会去掉标题栏 } 注意:mask的图多余部分设为白色
  11. }

四. 半透明窗口

1.窗口整体透明,但是窗体上的控件不透明。 通过设置窗体的背景色来实现,将背景色设置为全透。

点击(此处)折叠或打开

  1. QPalette pal = palette();
  2. pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00));
  3. setPalette(pal);

注:窗体标题栏不透明,窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。
  另外从网上看到的方法:

点击(此处)折叠或打开

  1. setAttribute(Qt::WA_TranslucentBackground, true);

试验的结果是类似于上面的方法,但有时候窗体会被一些杂色斑点填充,未找到原因。

2.窗口及其上面的控件都半透明:

点击(此处)折叠或打开

  1. setWindowOpacity(0.7);

试验效果:窗口及控件都半透明。注意不能够setWindowFlags(Qt::FramelessWindowHint);要不就不起作用

3.窗口整体不透明,局部透明:

在Paint事件中使用Clear模式绘图。

点击(此处)折叠或打开

  1. void TestWindow::paintEvent( QPaintEvent* )
  2. {
  3. QPainter p(this);
  4. p.setCompositionMode( QPainter::CompositionMode_Clear );
  5. p.fillRect( 10, 10, 300, 300, Qt::SolidPattern );
  6. }

试验效果:绘制区域全透明。如果绘制区域有控件不会影响控件。

以上实验均是基于Directfb的Qte测试。在Linux下及Windows下效果会略有不同。 
比如在Windows下第3个实验,绘制区域就是一个黑窟窿,如果Window本身半透,则是Window下面的内容加上半透效果,不是全透明效果。

五. 控制QPixmap的alpha

点击(此处)折叠或打开

  1. QPixmap temp(pixmapTop.size()); temp.fill(Qt::transparent);
  2. QPainter p(&temp);
  3. p.setCompositionMode(QPainter::CompositionMode_Source);
  4. p.drawPixmap(0, 0, pixmapTop);
  5. p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
  6. p.fillRect(temp.rect(), QColor(0, 0, 0, alpha)); //--lable显示前景图片 ui->label->setScaledContents(true);
  7. ui->label->setPixmap(temp);

六. layout 的边界

点击(此处)折叠或打开

  1. layout->setMargin (0);

终于把qt半透明搞定了

本文来自:http://hi.baidu.com/sszllx/blog/item/ab833a59ea98622f2934f001.html

点击(此处)折叠或打开

  1. QFrame *frame = new QFrame();
  2. QPixmap grabPixmap = QPixmap::grabWindow( frame->winId(), 20, 0, 100, 100 );
  3. frame->setGeometry( 20, 20, 100, 100 );
  4. frame->hide();
  5. QPixmap pixmap = Resource::loadPixmap( "qpelogo" );
  6. QImage image = pixmap.convertToImage();
  7. //image.convertDepth( 32 );
  8. image.setAlphaBuffer( true );
  9. QImage bgImage = grabPixmap.convertToImage();
  10. //bgImage.convertDepth( 32 );
  11. bgImage.setAlphaBuffer( true );
  12. double k = 0.5;
  13. QRgb *rgbpos1 = image.colorTable();
  14. QRgb *rgbpos2 = bgImage.colorTable();
  15. for( int y = 0; y < 80; y++ )
  16. for( int x = 0; x < 80; x++ )
  17. {
  18. #if 1
  19. uint rgb1 = image.pixel( x, y );
  20. uint rgb2 = bgImage.pixel( x, y );
  21. unsigned int red = qRed(rgb1);
  22. unsigned int green = qGreen(rgb1);
  23. unsigned int blue = qBlue(rgb1);
  24. unsigned int bgred = qRed(rgb2);
  25. unsigned int bggreen = qGreen(rgb2);
  26. unsigned int bgblue = qBlue(rgb2);
  27. red = k * red + ( 1 - k ) * bgred;
  28. green = k * green + ( 1 - k ) * bggreen;
  29. blue = k * blue + ( 1 - k ) * bgblue;
  30. //red = red << 4;
  31. //green = green << 4;
  32. //blue = blue << 4;
  33. #endif
  34. //color = QColor( red, green, blue );
  35. //unsigned int myrgb = color.rgb();
  36. //image.setPixel( x, y, myrgb );
  37. uint *p = (uint *)image.scanLine(y) + x;
  38. *p = qRgb( red, green, blue );
  39. }
  40. qWarning("%d %d", image.depth(), bgImage.depth());
  41. grabPixmap.convertFromImage( image );
  42. frame->setBackgroundPixmap( grabPixmap );
  43. frame->show();
  44. #endif


窗口嵌入桌面
ps:这儿用上了前面一文提到的函数findDesktopIconWnd()。
本文来自:http://mypyg.blog.51cto.com/820446/263369

一、将Qt窗口嵌入到桌面中。
声明一个最简单的类:

点击(此处)折叠或打开

  1. class Dialog : public QDialog
  2. {
  3. Q_OBJECT
  4. public:
  5. Dialog(QWidget *parent = 0);
  6. ~Dialog();
  7. }

函数实现:

点击(此处)折叠或打开

  1. Dialog::Dialog(QWidget *parent) : QDialog(parent)
  2. {
  3. //创建个LineEdit用来测试焦点
  4. QLineEdit* le = new QLineEdit(this);
  5. }
  6. Dialog::~Dialog()
  7. {
  8. }

主函数:

点击(此处)折叠或打开

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. Dialog w;
  5. HWND desktopHwnd = findDesktopIconWnd();
  6. if(desktopHwnd) SetParent(w.winId(), desktopHwnd);
  7. w.show();
  8. return a.exec();
  9. }

有个窗口嵌入了桌面。按win+D组合键可以看到此窗口在桌面上。运行效果:

二、让窗口全透明:
2.1最容易想到的就是setWindowOpacity()函数了。

点击(此处)折叠或打开

  1. w.setWindowOpacity(0.5);

运行:结果杯具了,此函数完全无效,因为其父窗口特殊,这个函数内部使用的系统窗口标志不被支持。
2.2

点击(此处)折叠或打开

  1. w.setAttribute(Qt::WA_TranslucentBackground, true);

全透明ok。如果其父窗口为空的话,透明的地方会成为黑块。运行效果:

三、让窗口半透明
3.1

点击(此处)折叠或打开

  1. w.setAttribute(Qt::WA_TranslucentBackground, true) + 背景调色板

运行效果仍然是全透明,因为TranslucentBackground为true,根本不画背景。
3.2单纯的背景调色板:

点击(此处)折叠或打开

  1. QPalette pal = w.palette();
  2. pal.setColor(QPalette::Background, QColor(100,100,100,50));
  3. w.setPalette(pal);
  4. w.setAutoFillBackground(true);

运行效果出现了半透明:

但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。
ps:加一句 w.setAttribute(Qt::WA_OpaquePaintEvent,true); 窗口就能够一直保持这个效果了。即这个方案可行。
pps:此方案在XP也是黑色底块。
3.3转战paintEvent()

点击(此处)折叠或打开

  1. void Dialog::paintEvent(QPaintEvent *e)
  2. {
  3. QPainter p(this);
  4. p.fillRect(rect(), QColor(0,0xff,0,30));
  5. }

用一个带有alpha值的颜色填充背景,运行效果发现颜色确实有alpha值,但是桌面的内容透不过来。
3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()
得到了设想中的效果。运行效果:

最终的主函数代码:

点击(此处)折叠或打开

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. Dialog w;
  5. HWND desktopHwnd = findDesktopIconWnd();
  6. if(desktopHwnd) SetParent(w.winId(), desktopHwnd);
  7. w.setAttribute(Qt::WA_TranslucentBackground, true);
  8. w.show();
  9. return a.exec();
  10. }

最终的dialog实现代码:

点击(此处)折叠或打开

  1. Dialog::Dialog(QWidget *parent) : QWidget(parent)
  2. {
  3. //创建个LineEdit用来测试焦点
  4. QLineEdit* le = new QLineEdit(this);
  5. }
  6. Dialog::~Dialog()
  7. {
  8. }
  9. void Dialog::paintEvent(QPaintEvent *e)
  10. {
  11. QPainter p(this);
  12. p.fillRect(rect(), QColor(0,0xff,0,30));
  13. }

PS:
经测试此代码在XP运行不正常。窗口成为黑色背景块。只能是颜色半透明了。
还有就是图标会被盖住。只能把w.setAttribute(Qt::WA_TranslucentBackground, true);注释掉,有半透明颜色,无法看到桌面。

在QT中自绘控件的方法说明
本文来自:http://blog.csdn.net/dotboy/archive/2009/06/22/4287805.aspx

首先给出在QT中进行标题栏自绘的方法(两个网址给出了方法和参考代码)

litterflybug的专栏 ::http://blog.csdn.net/litterflybug/archive/2009/05/07/4157482.aspx

QT官方FAQ: http://www.qtsoftware.com/developer/faqs/faq.2007-04-25.2011048382

其次,做一点关于在windows平台下将顶级窗口透明化的说明

1.在4.5版本以前,要实现Top level窗口的透明化,需要使用setMask方法,该方法有两个重载,一个是QRegion定义一个区域表明这一区域是要被绘制的区域,在该区域以外的地方是不需要绘制的.第二个重载版本是需要一个QBitmap,这个QBitmap只需要一张单色位图就可以了(另外,一张带有透明效果的PNG图片被读入QPixmap中以后,可以使用函数mask()返回一张与原图对应的单色位图,这很方便实际使用),白色部分表示是不透明要被绘制的区域,黑色部分表示该区域不应该被绘制(能实现透明的效果).

2.4.5版本发行以后,可以设置窗口属性Qt::WA_TranslucentBackground来设定该窗口透明显示,但是有一个问题,就是如果该窗口是个top level窗口,就会有标题栏(title bar), 在windows平台下,如果不把这个标题栏去掉(设置Qt::FramelessWindowHint 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)

qt 设置子控件为半透明和背景色问题

本文来自:http://bbs.csdn.net/topics/370078118

在子widget的构造函数里添加如下几句:

点击(此处)折叠或打开

  1. QPalette myPalette;
  2. QColor myColor(0,0,0);
  3. myColor.setAlphaF(0.2);
  4. myPalette.setBrush(backgroundRole(),myColor);
  5. this->setPalette(myPalette);
  6. this->setAutoFillBackground(true);

原理是:改子widget的背景色+修改alpha值(设置半透明)

改子widget的背景色 :

点击(此处)折叠或打开

  1. QPalette myPalette;
  2. QColor myColor(0,0,0);
  3. myPalette.setBrush(backgroundRole(),myColor);
  4. this->setPalette(myPalette);
  5. this->setAutoFillBackground(true);//这句很关键,缺少的话,背景色修改不成功

修改alpha值:

点击(此处)折叠或打开

  1. myColor.setAlphaF(0.2);//通过设置alpha值来改变透明度

qt 窗口圆角问题
本文来自:http://blog.csdn.net/fariel_zhang/article/details/6315463

最近在用qss做界面美化的工作,发现一个问题就是qss不能对顶级窗口设置边角圆弧,于是得另辟蹊径。据网上搜索可得到的方法我实现了三种:

1.

点击(此处)折叠或打开

  1. setWindowFlags(Qt::FramelessWindowHint);
  2. QBitmap bmp(this->size());
  3. bmp.fill();
  4. QPainter p(&bmp);
  5. // p.setPen(Qt::NoPen);
  6. // p.setBrush(Qt::black);
  7. p.setRenderHint(QPainter::Antialiasing);
  8. //p.drawRoundedRect(bmp.rect(), 20, 20); //四个角都是圆弧
  9. //只要上边角圆弧
  10. int arcR = 20;
  11. QRect rect = this->rect();
  12. QPainterPath path;
  13. //逆时针
  14. path.moveTo(arcR, 0);
  15. path.arcTo(0, 0, arcR * 2, arcR * 2, 90.0f, 90.0f);
  16. path.lineTo(0, rect.height());
  17. path.lineTo(rect.width(), rect.height());
  18. path.lineTo(rect.width(), arcR);
  19. path.arcTo(rect.width() - arcR * 2, 0, arcR * 2, arcR * 2, 0.0f, 90.0f);
  20. path.lineTo(arcR, 0);
  21. p.drawPath(path);
  22. p.fillPath(path, QBrush(Qt::Red)); //arm和windows平台没有这行代码将显示一个透明的空空的框
  23. setMask(bmp);

2.

构造函数中

点击(此处)折叠或打开

  1. setAttribute(Qt::WA_TranslucentBackground, true);
  2. setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint
  3. | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);

重载paintEvent

点击(此处)折叠或打开

  1. QPainter p(this);
  2. p.drawRoundedRect(0, 0, width() - 1, height() - 1, 20, 20);

3.背景图片

点击(此处)折叠或打开

  1. QPixmap pixmap(":/images/*.png");
  2. setMask(pixmap.mask());
  3. QPalette palette;
  4. palette.setBrush(QPalette::Background, QBrush( pixmap ) );
  5. setPalette(palette);
  6. resize( pixmap.size() );
  7. setMask(pixmap.mask());

同样的一个setMask();在三个不同的平台上区别倒是很大,很是奇怪。

时间: 2024-08-04 16:41:51

QT透明的经验汇编的相关文章

QT多线程编程经验

自动化生产设备软件开发背景,主要关于视觉引导.运动控制和人机交互.三年的开发积累,基本都是在QT+VS2013平台上进行.本编随笔主要总结下多线程编程上的经验. 背景 上图是一个用于机器视觉引导的软件截图,软件由七个工作线程组成,各个工作线程负责接收控制系统的引导请求,采集图像后进行处理分析.模式匹配和坐标转换后,返回目标坐标数据.工作中使用的通信方式的TCP/IP以太网通信,在后文会提及到两种通信方式,一是工作线程内的同步方式,二是代理线程内异步方式.

CentOS下Qt窗口透明效果失效,成黑色背景的问题

一.问题 Linux系统下Qt窗口的透明效果成了黑色,但同样的代码在windows机子上有透明效果,主要是修改系统的配置,仅在centos6.3及其以上版本实验过.其他系统可以相应配置. 二.问题运行图 (1)Qt透明效果,centos下运行都会出现如下图1所示. 三.解决方法 (1)窗口透明,窗口上的控件不透明,其代码设置 [html] view plain copy setAutoFillBackground(false);  //这个不设置的话就背景变黑 setWindowFlags(Qt

Qt浮动按钮的实现(使用窗口背景透明、实现只显示浮动按钮的目的)

Qt浮动按钮的实现 效果如下: 图3 估计很多做Qt有一定经验的朋友会觉得这个效果不难,但是这是一个需求奇葩的实际业务中做出的效果.笔者会想讲下客户的需求和整体框架的矛盾. 整个项目主要是由Qt搭建的,图上的地图是JavaScript实现的.显然要实现这个效果在地图控件中去实现在结构上会更加合理,但是这些按钮的功能是需要打开对应的QWidget,如果是在地图控件中实现会让这个公司长期维护的地图控件嵌入业务相关的代码,这是不合理的.如果是在Qt这里实现,因为地图控件是嵌入在一个QWidget中,所

静态编译Qt5.4.1和Qt WebKit

blog文章地址:http://godebug.org/index.php/archives/133/ WebKit是个好东西,做爬虫.显示网页还是想用HTML来做桌面应用的界面都可以用他,不过一直以来都觉得自己编译webkit费力不讨好,所以都是用的qt官方编译好的,至于静态编译webkit,我之前一直以为是根本不可能的.后来看qt forum上说其实是可以的,不过是因为开源协议的问题qt默认的静态编译只是把webkit给排除了,自己编译一下webkit就好了,既然如此,那我就当小白试一下.不

Qt的Script、Quick、QML的关系与总结

背景 最近在学QML,感觉也不难,就是一直以来接触 Qt 的脚本类的东西的顺序是Script.Quick1.Declarative.Quick2.QML.那么每一个都是干什么的呢,这些东西搞的我有点混乱,所以决定把他们的大概都先弄清楚,以便更好地学习. 历史 先去扒一下它们的历史. QtScript 从 Qt 4.3 开始引入.Qt Quick1 从 Qt 4.7 开始引入.Qt Quick1 包含 Qt Declarative 模块.QML.Qt Quick1.1 从 Qt 4.8 开始引入.

工作多年精通C++该具备哪些技能,你会了吗?(进阶C++职业规划)

一.C++服务器程序员(流媒体后台,游戏后台,高性能服务器后台) 精通C++,STL,Linux等,熟悉设计模式: 熟练掌握一门脚本语言(Lua, Python, Perl等): 对多线程环境编程有一定的理解,能独立完成服务器端模块的开发.维护和优化: 熟练掌握MySQL数据库的开发维护.性能优化: 最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题.1.精通C++编程,3年以上服务器开发经验: 2.有

QtScript, QML, Quick1, Quick2, Declarative 之间的关系

QtScript是基于 ECMAScript 的脚本语言 在脚本中可以访问原有C++代码中的QObject类型及其子类的实例,连接信号和槽:也可以创建QObject类型及其子类的实例. 但是QtScript并不能独立运行,必须和C++代码配合才能实现完整的功能. 在 Qt 5 中把 Qt Script 和 Qt Script Tool 2个模块,从模块的列表中消失了,虽然依然保留在了 Qt 5 中,但重要性降低了不少. Qt Quick1 是一个集合,用于在各种移动设备上创建交互界面.设计的目的

QT5.7.0在win10下使用visual studio 2015编译(目标平台 xp)

环境:win10+vs2015+QT5.7.0 目标:编译出能在windows xp上运行的QT 通过baidu和bing找不出来的结果没有一个能成功运行,大部分都能编译成功,并完美解决“exe不是有效的win32程序”,但是程序依旧没法正常显示窗口. 此时会有一个crash,具体位置是qwindows.dll,但是使用depends查看也没看出来qwindows.dll有问题,有些人会遇到qwindows.dll依赖的 kernel32.dll在xp下没有对应接口,具体接口不记得了,最后看到是

Docker——容器与容器云——互动出版网

这篇是计算机类的优质预售推荐>>>><Docker--容器与容器云> Docker和Kubernetes这一本就够了!从内核知识到容器原理,容器云技术深度揭秘!全面理解Docker源码实现与高级使用技巧.深入解读Kubernetes源码分析和最佳实践! 编辑推荐 从源码层面深度解析Docker核心原理 Kubernetes源码完全解读+最佳实践 广泛涵盖Docker高级实践技巧 全面梳理主流容器云技术架构方法 内容简介 本书从实践者的角度,在讲解Docker高级实践技巧