Qt 的一些心得(背景设置,圆角,半透明)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));

//bgpal.setColor (QPalette::Background, Qt::transparent);

bgpal.setColor (QPalette::Foreground, QColor (255,255,255,255)); setPalette (bgpal);

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

setStyleSheet ("background-color: #000000;color: #ffffff;");

不影响子控件的方法是:

setStyleSheet ("venus--TitleBar {background-color: #000000;color: #ffffff;}");

二. 圆角控件 用stylesheet方式

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

三. 圆角窗口 RoundRectWin::RoundRectWin() { QPalette p = palette(); QPixmap img("roundrect.png");

    QBitmap mask("roundrect_mask.png");

    p.setBrush(QPalette::Window, QBrush(img));

    setPalette(p);

    setMask(mask);

    resize(img.size());

    //setWindowFlags(Qt::FramelessWindowHint);//这句会去掉标题栏 } 注意:mask的图多余部分设为白色

四. 半透明窗口

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

pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); setPalette(pal); 试验效果:

窗体标题栏不透明;

窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。

另外从网上看到的方法: setAttribute(Qt::WA_TranslucentBackground, true); 试验的结果是类似于上面的方法,但有时候窗体会被一些杂色斑点填充,未找到原因。

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

setWindowOpacity(0.7)

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

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

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

void TestWindow::paintEvent( QPaintEvent* )

{ QPainter p(this);

               p.setCompositionMode( QPainter::CompositionMode_Clear ); p.fillRect( 10, 10, 300, 300, Qt::SolidPattern ); }

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

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

五. 控制QPixmap的alpha

QPixmap temp(pixmapTop.size()); temp.fill(Qt::transparent);

    QPainter p(&temp);

    p.setCompositionMode(QPainter::CompositionMode_Source);

    p.drawPixmap(0, 0, pixmapTop);

    p.setCompositionMode(QPainter::CompositionMode_DestinationIn);

    p.fillRect(temp.rect(), QColor(0, 0, 0, alpha)); //--lable显示前景图片 ui->label->setScaledContents(true);

    ui->label->setPixmap(temp);

六. layout 的边界 layout->setMargin (0);

本文来自CSDN博客:http://blog.csdn.net/lpt19832003/archive/2010/03/15/5381095.aspx


终于把qt半透明搞定了

QFrame *frame = new QFrame();
QPixmap grabPixmap = QPixmap::grabWindow( frame->winId(), 20, 0, 100, 100 );
frame->setGeometry( 20, 20, 100, 100 );
frame->hide();

QPixmap pixmap = Resource::loadPixmap( "qpelogo" );

QImage image = pixmap.convertToImage();
//image.convertDepth( 32 );
image.setAlphaBuffer( true );
QImage bgImage = grabPixmap.convertToImage();
//bgImage.convertDepth( 32 );
    bgImage.setAlphaBuffer( true );

    double k = 0.5;

QRgb *rgbpos1 = image.colorTable();
QRgb *rgbpos2 = bgImage.colorTable();

for( int y = 0; y < 80; y++ )
   for( int x = 0; x < 80; x++ )
    {

#if 1
       uint rgb1 = image.pixel( x, y );
     uint rgb2 = bgImage.pixel( x, y );
     unsigned int red = qRed(rgb1);
     unsigned int green = qGreen(rgb1);
     unsigned int blue = qBlue(rgb1);
     unsigned int bgred = qRed(rgb2);
     unsigned int bggreen = qGreen(rgb2);
     unsigned int bgblue = qBlue(rgb2);

     red = k * red + ( 1 - k ) * bgred;
     green = k * green + ( 1 - k ) * bggreen;
     blue = k * blue + ( 1 - k ) * bgblue;
     //red = red << 4;
     //green = green << 4;
     //blue = blue << 4;
#endif
     //color = QColor( red, green, blue );
     //unsigned int myrgb = color.rgb();
     //image.setPixel( x, y, myrgb );
     uint *p = (uint *)image.scanLine(y) + x;
                *p = qRgb( red, green, blue );
    
    }


qWarning("%d %d", image.depth(), bgImage.depth());

grabPixmap.convertFromImage( image );

frame->setBackgroundPixmap( grabPixmap );
frame->show();
#endif

zz: http://hi.baidu.com/sszllx/blog/item/ab833a59ea98622f2934f001.html


Qt实现嵌入桌面的半透明窗口

这儿用上了前面一文提到的函数findDesktopIconWnd()。
见: http://mypyg.blog.51cto.com/820446/263349

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

Qt实现嵌入桌面的半透明窗口 class Dialog :  public QDialog
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  Q_OBJECT
Qt实现嵌入桌面的半透明窗口
public:
Qt实现嵌入桌面的半透明窗口  Dialog(QWidget *parent = 0);
Qt实现嵌入桌面的半透明窗口  ~Dialog();
Qt实现嵌入桌面的半透明窗口}
函数实现:
Qt实现嵌入桌面的半透明窗口Dialog::Dialog(QWidget *parent)  : QDialog(parent)
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  //创建个LineEdit用来测试焦点
Qt实现嵌入桌面的半透明窗口  QLineEdit* le =  new QLineEdit( this);
Qt实现嵌入桌面的半透明窗口}
Qt实现嵌入桌面的半透明窗口
Dialog::~Dialog()
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口}
主函数:
Qt实现嵌入桌面的半透明窗口 int main( int argc,  char *argv[])
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  QApplication a(argc, argv);
Qt实现嵌入桌面的半透明窗口  Dialog w;
Qt实现嵌入桌面的半透明窗口
HWND desktopHwnd = findDesktopIconWnd();
Qt实现嵌入桌面的半透明窗口  if(desktopHwnd) SetParent(w.winId(), desktopHwnd);
Qt实现嵌入桌面的半透明窗口
w.show();
Qt实现嵌入桌面的半透明窗口  return a.exec();
Qt实现嵌入桌面的半透明窗口}
运行效果:
转载: qt 的一些心得(背景设置,圆角,半透明) - 楚江北 - 矮子爬梯
有个窗口嵌入了桌面。按win+D组合键可以看到此窗口在桌面上。

二、让窗口全透明:
2.1最容易想到的就是setWindowOpacity()函数了。
w.setWindowOpacity(0.5),运行:结果杯具了,此函数完全无效,因为其父窗口特殊,这个函数内部使用的系统窗口标志不被支持。
2.2
w.setAttribute(Qt::WA_TranslucentBackground, true);
运行效果:
转载: qt 的一些心得(背景设置,圆角,半透明) - 楚江北 - 矮子爬梯
全透明ok。如果其父窗口为空的话,透明的地方会成为黑块。

三、让窗口半透明
3.1w.setAttribute(Qt::WA_TranslucentBackground, true) + 背景调色板
运行效果仍然是全透明,因为TranslucentBackground为true,根本不画背景。
3.2单纯的背景调色板:
Qt实现嵌入桌面的半透明窗口QPalette pal = w.palette();
Qt实现嵌入桌面的半透明窗口  pal.setColor(QPalette::Background, QColor(100,100,100,50));
Qt实现嵌入桌面的半透明窗口  w.setPalette(pal);
Qt实现嵌入桌面的半透明窗口  w.setAutoFillBackground( true);
运行效果出现了半透明:
转载: qt 的一些心得(背景设置,圆角,半透明) - 楚江北 - 矮子爬梯
但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。
3.3转战paintEvent()
Qt实现嵌入桌面的半透明窗口 protected:
Qt实现嵌入桌面的半透明窗口  void paintEvent(QPaintEvent *);
Qt实现嵌入桌面的半透明窗口 void Dialog::paintEvent(QPaintEvent *e)
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  QPainter p( this);
Qt实现嵌入桌面的半透明窗口  p.fillRect(rect(), QColor(0,0xff,0,30));
Qt实现嵌入桌面的半透明窗口}
用一个带有alpha值的颜色填充背景,运行效果发现颜色确实有alpha值,但是桌面的内容透不过来。
3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()
运行效果:
转载: qt 的一些心得(背景设置,圆角,半透明) - 楚江北 - 矮子爬梯
得到了设想中的效果。
最终的主函数代码:
Qt实现嵌入桌面的半透明窗口 int main( int argc,  char *argv[])
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  QApplication a(argc, argv);
Qt实现嵌入桌面的半透明窗口  Dialog w;
Qt实现嵌入桌面的半透明窗口
HWND desktopHwnd = findDesktopIconWnd();
Qt实现嵌入桌面的半透明窗口  if(desktopHwnd) SetParent(w.winId(), desktopHwnd);
Qt实现嵌入桌面的半透明窗口
w.setAttribute(Qt::WA_TranslucentBackground,  true);
Qt实现嵌入桌面的半透明窗口
w.show();
Qt实现嵌入桌面的半透明窗口  return a.exec();
Qt实现嵌入桌面的半透明窗口}
最终的dialog实现代码:
Qt实现嵌入桌面的半透明窗口Dialog::Dialog(QWidget *parent)  : QWidget(parent)
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  //创建个LineEdit用来测试焦点
Qt实现嵌入桌面的半透明窗口  QLineEdit* le =  new QLineEdit( this);
Qt实现嵌入桌面的半透明窗口}
Qt实现嵌入桌面的半透明窗口
Dialog::~Dialog()
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口}
Qt实现嵌入桌面的半透明窗口
void Dialog::paintEvent(QPaintEvent *e)
Qt实现嵌入桌面的半透明窗口{
Qt实现嵌入桌面的半透明窗口  QPainter p( this);
Qt实现嵌入桌面的半透明窗口  p.fillRect(rect(), QColor(0,0xff,0,30));
Qt实现嵌入桌面的半透明窗口}


PS:
经测试此代码在XP运行不正常。窗口成为黑色背景块。只能是颜色半透明了。
还有就是图标会被盖住。

在QT中自绘控件的方法说明 收藏 
首先给出在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 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)


本文部分来自CSDN博客,转载请标明出处:http://blog.csdn.net/dotboy/archive/2009/06/22/4287805.aspx


Qt::WA_TranslucentBackground 即便混成关闭,设置 `Qt::WA_TranslucentBackground` 后,Qt会通过调整窗口的绘制请求来优化X11的重绘过程,减少了可能的残影现象。- 没有设置透明背景时,Qt会向X11发出绘制请求,但这些请求可能不会触发对窗口背景的重新绘制,因为X11并不需要“清空”旧的背景内容,只需绘制新内容。它通过调用X11的API来请求重绘、移动窗口等操作,但实际的渲染是由X11来完成的。当混成关闭时,窗口的绘制通常是由X11或其他窗口系统(如Wayland)来处理,而不是Qt直接绘制。 阅读详情

相关推荐

Qt 设置窗体透明

在音频开发中,窗体多半为半透明圆角窗体,如下为Qt 5.5 VS2013实现半透明方法总结。

QtCompany的博客 3792

QT 实现窗口四周阴影

网上好多写的不清楚。。。又搞了好长时间。这样应该最简单了。 一、效果图 二、思路 1.先将所有窗口控件拖到一个QFrame里,因为设置对象阴影其子控件也会生效,所以需要这一步,让其无法生效。(最关键) 2.设置窗口背景透明 setAttribute(Qt::WA_TranslucentBackground); 3.设置参数 QGraphicsDropShadowEffect *effect =...

guorong520的博客 1万+

Qt设置窗口边框的圆角

Qt paintEvent setStyleSheet

前行之路还需前行 6万+

Qt / 窗体设置 Qt::WA_TranslucentBackground 为全黑的原因

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

布袋和尚 7418

qdialog 圆角_Qt 的一些心得背景设置圆角半透明

一. 背景刷成黑色,前景色设为白色。 方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用 QPalette bgpal = palette();bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));//bgpal.setColor (QPalette::Background, Qt::transparent...

weixin_39613433的博客 1942

pyqt5 窗口设置圆角_Qt 的一些心得背景设置圆角半透明

一. 背景刷成黑色,前景色设为白色。 方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用 QPalette bgpal = palette();bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));//bgpal.setColor (QPalette::Background, Qt::transparent...

weixin_39911007的博客 3229

QT QWidget设置圆角无效果

QT QWidget设置圆角无效果 .qss内容: QWidget { border: none; background-color: rgba(0, 0, 0, 204); border-radius: 4px; color: #FFFFFF; } 原因:有二 原因一: 没有父窗口或者有popup等风格时, 只有background, background-clip and background-origin等会生效, 需要设置: void Widget::paintEvent(QPaintEvent *

weixin_44899507的博客 5439

Qt美化界面的心得整理

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

ylluo_hust的专栏 1万+

qwidget美化_Qt美化界面的心得整理

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

weixin_42117224的博客 2447

Qt 窗口置顶且半透明且为圆角矩形 Qt内核规则

当窗口为顶层窗口时候,设置stylesheet圆角矩形和半透明功能, Qt是没有效果的,设置背景透明和无边框也是没有用的,这个是Qt 固定的规则,按照Qt固定的规则实行就好了,如果需要实行顶层窗口 的半透明圆角矩形的功能,由于Qt这条固定规则的限制,只能另外找其他 方式实现了,具体实现办法有: 1....

a1317338022的博客 520

Qt之QWidget 制作圆角半透明窗体

简述 要使窗体变为圆角需要设置窗体为无边框属性 要使窗体可以修改背景透明度需要设置窗体为背景透明属性 需要对窗体重新绘制 样例 代码 #include "MWidget.h" #include <QLabel> #include <QPainter> #include <QHBoxLayout> MWidget::MWidget(QWidget *parent) : QWidget(...

Ilson_的博客 1567

QT 如何实现 半透明圆角 矩形 窗口

在日常使用的软件里面,有些软件提示用户时,经常会发现有些提示窗口是半透明的。那么如何实现一个可拖动的、半透明圆角矩形窗口呢?整体思路:将窗口本身设置透明,然后通过qss或者绘图的方式来实现半透明的效果。

HelloKandy's Blog 2288

QT实现半透明窗口面板的完整示例

Qt 是一个跨平台的C++应用程序框架,自1991年由奇趣科技公司开发以来,已经成为构建图形用户界面(GUI)应用程序、嵌入式系统以及高度可移植软件的首选工具。Qt的设计哲学基于“写一次,到处运行”的理念,这得益于其独特的元对象编译器(MOC)和信号与槽机制,使得开发者能够以更加灵活和高效的方式编写程序。它提供了一套丰富的API,支持包括但不限于2D/3D图形、数据库、网络、多媒体和并行处理等多种功能。

weixin_42097508的博客 1003

QT 修改控件背景颜色

一. 背景刷成黑色,前景色设为白色。 方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用 QPalette bgpal = palette(); bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255)); //bgpal.setColor (QPalette::Background, Qt::tra

大步朝前 2万+

Qt绘制具有圆角半透明效果的窗口(C++)

Qt中,我们可以使用QPainter类和QWidget类来实现绘制具有圆角半透明效果的窗口。下面是一个示例代码,展示了如何创建这样的窗口。通过运行上述代码,您将得到一个具有圆角半透明效果的窗口。您可以根据需要调整窗口的大小、颜色和圆角半径,以满足您的需求。在这个示例中,我们将背景颜色设置为黑色,并指定透明度为128,以实现半透明效果。的自定义窗口类,它继承自QWidget。在构造函数中,我们设置了窗口的标志为。,这样可以去掉窗口的边框,使其看起来更像一个自定义窗口。在这个示例中,我们创建了一个名为。

zhouKouUU的博客 314

Qt制作带圆角半透明效果的窗体

在paintEvent()函数中,我们使用QPainter来绘制窗体的背景色和透明度。本文将介绍如何使用Qt中的QWidget控件制作带圆角半透明效果的窗体。我们将对QWidget控件的paintEvent()函数进行重载,并使用QPainter来绘制我们想要的窗体形状和效果。在这个示例代码中,我们创建了一个名为MyWidget的QWidget子类来实现我们想要的窗体形状和效果。这是一个简单但有用的例子,展示了如何使用Qt快速、轻松地创建带圆角半透明效果的窗体。用Qt制作带圆角半透明效果的窗体。

CodeJolt的博客 426
上一篇: python 中Sets浅析
下一篇: 坚持不懈,直到成功-I will persist. I will win.
Joseph-Growth
博客等级 码龄17年 120粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值