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

一. 背景刷成黑色,前景色设为白色。 方法一、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);

终于把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 p_w_picpath = pixmap.convertToImage();

//p_w_picpath.convertDepth( 32 );

p_w_picpath.setAlphaBuffer( true );

QImage bgImage = grabPixmap.convertToImage();

//bgImage.convertDepth( 32 );

bgImage.setAlphaBuffer( true );

double k = 0.5;

QRgb *rgbpos1 = p_w_picpath.colorTable();

QRgb *rgbpos2 = bgImage.colorTable();

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

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

{

#if 1

uint rgb1 = p_w_picpath.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();

//p_w_picpath.setPixel( x, y, myrgb );

uint *p = (uint *)p_w_picpath.scanLine(y) + x;

*p = qRgb( red, green, blue );

}

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

grabPixmap.convertFromImage( p_w_picpath );

frame->setBackgroundPixmap( grabPixmap );

frame->show();

#endif

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

这儿用上了前面一文提到的函数findDesktopIconWnd()。

见: http://mypyg.blog.51cto.com/820446/263349

一、将Qt窗口嵌入到桌面中。

声明一个最简单的类:

class Dialog : public QDialog

{

 Q_OBJECT

public:

 Dialog(QWidget *parent = 0);

 ~Dialog();

}

函数实现:

Dialog::Dialog(QWidget *parent) : QDialog(parent)

{

 //创建个LineEdit用来测试焦点

 QLineEdit* le = new QLineEdit(this);

}

Dialog::~Dialog()

{

}

主函数:

int main(int argc, char *argv[])

{

 QApplication a(argc, argv);

 Dialog w;

HWND desktopHwnd = findDesktopIconWnd();

 if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

w.show();

 return a.exec();

}

运行效果:

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

二、让窗口全透明:

2.1最容易想到的就是setWindowOpacity()函数了。

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

2.2

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

运行效果:

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

三、让窗口半透明

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

运行效果仍然是全透明,因为TranslucentBackground为true,根本不画背景。

3.2单纯的背景调色板:

QPalette pal = w.palette();

 pal.setColor(QPalette::Background, QColor(100,100,100,50));

 w.setPalette(pal);

 w.setAutoFillBackground(true);

运行效果出现了半透明:

但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。

3.3转战paintEvent()

protected:

 void paintEvent(QPaintEvent *);

void Dialog::paintEvent(QPaintEvent *e)

{

 QPainter p(this);

 p.fillRect(rect(), QColor(0,0xff,0,30));

}

用一个带有alpha值的颜色填充背景,运行效果发现颜色确实有alpha值,但是桌面的内容透不过来。

3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()

运行效果:

得到了设想中的效果。

最终的主函数代码:

int main(int argc, char *argv[])

{

 QApplication a(argc, argv);

 Dialog w;

HWND desktopHwnd = findDesktopIconWnd();

 if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

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

w.show();

 return a.exec();

}

最终的dialog实现代码:

Dialog::Dialog(QWidget *parent) : QWidget(parent)

{

 //创建个LineEdit用来测试焦点

 QLineEdit* le = new QLineEdit(this);

}

Dialog::~Dialog()

{

}

void Dialog::paintEvent(QPaintEvent *e)

{

 QPainter p(this);

 p.fillRect(rect(), QColor(0,0xff,0,30));

}

PS:

经测试此代码在XP运行不正常。窗口成为黑色背景块。只能是颜色半透明了。

还有就是图标会被盖住。

在QT中自绘控件的方法说明 收藏

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

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

其次,做一点关于在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 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java语言发展历史_Java编程语言的历史和未来

java语言发展历史通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 作为互联网上著名的编程语言 &#xff0c;Java对人们如何浏览数字世界产生了深远的影响。 Java功能设置了用户对他们访问互联网的设…

Linux 命令之 Bang(!) 命令

命令说明!!执行上一条命令^foo^ bar把上一条命令里的foo替换为bar&#xff0c;并执行!wget重复执行最近的以wget开头的命令!wget:p仅打印最近的以wget开头的命令&#xff0c;不执行!n执行历史命令列表第n条命令&#xff0c;例如执行第三条命令&#xff1a;!3!-n执行历史命令列表…

matlab resample上采样,resample matlab实现

使用线性插值实现sample rate转换。function output simpleResample(input, inputfs, outputfs)inputLen length(input(:, 1));outputLen floor(inputLen * outputfs / inputfs);output zeros(outputLen, 1);timeStep inputfs / outputfs;curTime 1;integer 0;frac 0;f…

c matlab 精度,svm去优化参数C和g,输出正确率accuracy老是0

下面这个是测试的M文件%% Matlab神经网络43个案例分析%% 清空环境变量function chapter_GridSearchclose all;clear;clc;format compact;%% 数据提取% 载入测试数据wine,其中包含的数据为classnumber 3,wine:178*13的矩阵,wine_labes:178*1的列向量load wine.mat;% 画出测试数…

微服务pact测试框架_消费者驱动的Pact和Spring Boot测试

微服务pact测试框架最近&#xff0c;我的一位同事偶然发现了Pact.io &#xff0c;我们目前的应用程序已扩展到 50多种服务&#xff0c;并且我们开始出现一些集成测试失败和脆弱的开发/验收测试环境。 因此&#xff0c;我们决定研究尝试与此相关的方法。 我从阅读开始&#xff…

用access建立一个试题库_Access考试题库(含答案).doc

所有单选题1、用Access创建的数据库文件&#xff0c;其扩展名是______。A&#xff1a;.adpB&#xff1a;.dbfC&#xff1a;.frmD&#xff1a;.mdb答案&#xff1a;D2、数据库系统的核心是______。A&#xff1a;数据模型B&#xff1a;数据库管理系统C&#xff1a;数据库D&#x…

Linux 命令之 arch --显示主机的硬件结构类型

文章目录介绍命令示例介绍 arch命令主要用于显示当前主机的硬件结构类型&#xff0c;arch命令输出的结果有&#xff1a;i386、i486、mips、alpha等。 此命令的适用范围&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 命令示例 显示当前主机硬件架构类…

mega5安装包_[MEGA DEAL] 2017年完全Java捆绑包(95%折扣)

mega5安装包深入了解编程奥德赛&#xff08;58小时&#xff01;&#xff09;&#xff0c;进入最常用的编程语言 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的2017 Complete Java Bundle 仅…

det曲线_平面曲线的曲率的复数表示

开学已经是第二周了&#xff0c;我的《微分几何》也上课两周了&#xff0c;进度比较慢&#xff0c;现在才讲到平面曲线的曲率。在平面曲线$\boldsymbol{t}(t)(x(t),y(t))$某点上可以找出单位切向量。$$\boldsymbol{t}\left(\frac{dx}{ds},\frac{dy}{ds}\right)$$其中$ds^2 dx^2…

matlab计算微分ppt,matlab-ch013(数值计算-微积分)20090923.ppt

matlab-ch013(数值计算-微积分)20090923.ppt 第13讲 数值计算 —微积分,张建瓴,13.1 数值积分,在工程教学和应用中&#xff0c;除了进行数据逼近外&#xff0c;还要求逼近曲线下面的面积&#xff0c;这就是积分问题。,一、数值积分方法,典型的数值积分方法有&#xff1a;用常数…

Linux 关于查看 cpu 的命令

文章目录查看物理 cpu 个数查看每个物理 cpu 中core的个数(即核数)查看逻辑 cpu 的个数查看 cpu 信息&#xff08;型号&#xff09;查看 cpu 的配置信息查看cpu波动情况的&#xff0c;尤其是多核机器上参考文档备注/说明查看物理 cpu 个数 [roothtlwk0001host ~]# cat /proc/c…

JDK 9中不推荐使用Java的Observer和Observable

在博客文章《 应用JDK 9 Deprecated增强功能》中 &#xff0c;我讨论了JDK 9中 Deprecated批注中对forRemoval&#xff08;&#xff09;和since&#xff08;&#xff09;可选元素&#xff08;方法&#xff09;的添加 。 我在那篇文章中说&#xff1a;“在Java SE API上应用新的…

php快速开发框架津县,BetePHP:一个轻量级快速开发框架

BetePHP关于BetePHP是一个轻量级快速开发框架。框架提供了一致的API接口&#xff0c;使得使用接口尽可能流畅&#xff1b;由于框架本身不依赖其他库&#xff0c;这使得框架本身运行速度非常快&#xff1b;框架希望使用最简单的方式make thing done&#xff0c;减少开发者的开发…

Linux 命令之 vmstat 命令-显示虚拟内存状态

介绍 vmstat 命令的含义为显示虚拟内存状态&#xff08;“Virtual Memory Statistics”&#xff09;&#xff0c;但是它可以报告关于进程、内存、I/O等系统整体运行状态。 常用选项 选项说明-a显示活跃和非活跃内存-f显示从系统启动至今的fork数量-m显示 slabinfo-n只在开始…

python编译后的文件_python 编译源文件

背景近期项目到了部署的阶段。由于项目后台和算法都是用Python "撸的"&#xff0c;但是又不希望将源代码直接 "release" 到 “客户”哪里。于是开始思考。。。首先&#xff0c;按照惯性思维&#xff0c;能否将编译后的东东放出去呢&#xff1f;(类似java或…

java创建和销毁一个对象_有效的Java –创建和销毁对象

java创建和销毁一个对象创建和销毁对象&#xff08;第2章&#xff09; 这是Joshua Blochs的《 有效的Java》第2章的简短摘要。我仅包括与自己相关的项目。 静态工厂&#xff08;项目1&#xff09; 静态工厂与构造函数的一些优点&#xff1a; 工厂方法的名称为构造函数添加了描…

WorkPlus一站式协同解决方案,助力企业降本增效

在企业数字化转型的过程中&#xff0c;很多企业都会遇到一个共同问题&#xff1a;重复建设基础功能&#xff0c;耗费大量时间和资源。为解决这一难题&#xff0c;WorkPlus已经将一些通用、基础且有技术门槛的功能进行了集成与开发&#xff0c;如IM&#xff08;即时通讯&#xf…

linux在oracle新建表,Oracle创建表及管理表

1. Oracle表的创建及管理创建表包括三个要素&#xff0c;表名&#xff0c;列名&#xff0c;数据类型。每个表都有对应不同的列&#xff0c;每个列都有唯一对应的数据类型。常用数据类型简介&#xff1a;数据类型描述CHARACTER(n)字符/字符串。固定长度 n。INTEGER(p)整数值(没有…

Linux 命令之 top -- 实时显示进程动态/查看进程信息

文章目录介绍常用选项交互命令参考示例示例 1&#xff1a;直接输入命令 top 就可以动态显示进程信息统计参数信息详解进程属性说明&#xff08;即进程列表的字段说明&#xff09;其它1.在 top 基本视图中&#xff0c;按键盘数字 1 可以监控每个逻辑 CPU 的状况2.敲击键盘 b&…

Linux 命令之 iostat 命令-监视系统输入输出设备和 cpu 的使用情况

介绍 iostat命令被用于监视系统输入输出设备和 CPU 的使用情况。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出 CPU 使用情况。同 vmstat 一样&#xff0c;iostat 也有一个弱点&#xff0c;就是它不能对某个进程进行深入分析&#xff0c;仅对系统的整体情况进行分…