QT透明的经验汇编


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

一. 背景刷成黑色,前景色设为白色。
方法一、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: rgb(0,0,0);color: rgb(255,255,255);”);不影响子控件的方法是:点击(此处)折叠或打开setStyleSheet(“venus–TitleBar {background-color: rgb(0,0,0);color: rgb(255,255,255);}”);
点击(此处)折叠或打开this>setObjectName(“pw”);//设置对象句,相当于css里的id
this>setStyleSheet(“#pw {border-p_w_picpath: url(:/new/prefix1/Pic/54.png);}”);//设置id对应元素的背景色
二. 圆角控件 用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);

本文来自http://hi.baidu.com/sszllx/blog/item/ab833a59ea98622f2934f001.html
点击(此处)折叠或打开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(inty=0;y80;y++)
for(intx=0;x80;x++)
{
#if1
uint rgb1=p_w_picpath.pixel(x,y);
uint rgb2=bgImage.pixel(x,y);
unsignedintred=qRed(rgb1);
unsignedintgreen=qGreen(rgb1);
unsignedintblue=qBlue(rgb1);
unsignedintbgred=qRed(rgb2);
unsignedintbggreen=qGreen(rgb2);
unsignedintbgblue=qBlue(rgb2);
red=k*red+(1k)*bgred;
green=k*green+(1k)*bggreen;
blue=k*blue+(1k)*bgblue;
//red=red4;
//green=green4;
//blue=blue4;
#endif
//color=QColor(red,green,blue);
//unsignedintmyrgb=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
窗口嵌入桌面

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

一、将Qt窗口嵌入到桌面中。
声明一个最简单的类:
点击(此处)折叠或打开classDialog:publicQDialog
{
Q_OBJECT

public:
Dialog(QWidget*parent=0);
~Dialog();
}函数实现:
点击(此处)折叠或打开Dialog::Dialog(QWidget*parent):QDialog(parent)
{
//创建个LineEdit用来测试焦点
QLineEdit*le=new QLineEdit(this);
}

Dialog::~Dialog()
{
}点击(此处)折叠或打开intmain(intargc,char*argv[])
{
QApplication a(argc,argv);
Dialog w;

HWND desktopHwnd=findDesktopIconWnd();
if(desktopHwnd)SetParent(w.winId(),desktopHwnd);

w.show();
return a.exec();
}点击(此处)折叠或打开w.setWindowOpacity(0.5);点击(此处)折叠或打开w.setAttribute(Qt::WA_TranslucentBackground,true);全透明ok。如果其父窗口为空的话,透明的地方会成为黑块。运行效果:

三、让窗口半透明
3.1
点击(此处)折叠或打开w.setAttribute(Qt::WA_TranslucentBackground,true)+背景调色板点击(此处)折叠或打开QPalette pal=w.palette();
pal.setColor(QPalette::Background,QColor(100,100,100,50));
w.setPalette(pal);
w.setAutoFillBackground(true);运行效果出现了半透明:

但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。
ps:加一句 w.setAttribute(Qt::WA_OpaquePaintEvent,true); 窗口就能够一直保持这个效果了。即这个方案可行。
pps:此方案在XP也是黑色底块。
3.3转战paintEvent()
点击(此处)折叠或打开void Dialog::paintEvent(QPaintEvent*e)
{
QPainter p(this);
p.fillRect(rect(),QColor(0,0xff,0,30));
}点击(此处)折叠或打开intmain(intargc,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(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));
}首先给出在QT中进行标题栏自绘的方法(两个网址给出了方法和参考代码)litterflybug的专栏::http://blog.csdn.net/litterflybug/archive/2009/05/07/4157482.aspxQT官方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标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)本文来自http://bbs.csdn.net/topics/370078118

在子widget的构造函数里添加如下几句:
点击(此处)折叠或打开QPalette myPalette;
QColor myColor(0,0,0);
myColor.setAlphaF(0.2);
myPalette.setBrush(backgroundRole(),myColor);
this>setPalette(myPalette);
this>setAutoFillBackground(true);原理是:改子widget的背景色+修改alpha值(设置半透明)

改子widget的背景色:
点击(此处)折叠或打开QPalette myPalette;
QColor myColor(0,0,0);
myPalette.setBrush(backgroundRole(),myColor);
this>setPalette(myPalette);
this>setAutoFillBackground(true);//这句很关键,缺少的话,背景色修改不成功
修改alpha值:

点击(此处)折叠或打开myColor.setAlphaF(0.2);//通过设置alpha值来改变透明度
qt 窗口圆角问题
本文来自http://blog.csdn.net/fariel_zhang/article/details/6315463
最近在用qss做界面美化的工作,发现一个问题就是qss不能对顶级窗口设置边角圆弧,于是得另辟蹊径。据网上搜索可得到的方法我实现了三种:1.点击(此处)折叠或打开setWindowFlags(Qt::FramelessWindowHint);
QBitmap bmp(this>size());
bmp.fill();
QPainter p(&bmp);
//p.setPen(Qt::NoPen);
//p.setBrush(Qt::black);
p.setRenderHint(QPainter::Antialiasing);
//p.drawRoundedRect(bmp.rect(),20,20);//四个角都是圆弧
//只要上边角圆弧
intarcR=20;
QRect rect=this>rect();
QPainterPath path;
//逆时针
path.moveTo(arcR,0);
path.arcTo(0,0,arcR*2,arcR*2,90.0f,90.0f);
path.lineTo(0,rect.height());
path.lineTo(rect.width(),rect.height());
path.lineTo(rect.width(),arcR);
path.arcTo(rect.width()arcR*2,0,arcR*2,arcR*2,0.0f,90.0f);
path.lineTo(arcR,0);
p.drawPath(path);
p.fillPath(path,QBrush(Qt::Red));//arm和windows平台没有这行代码将显示一个透明的空空的框
setMask(bmp);2.构造函数中点击(此处)折叠或打开 setAttribute(Qt::WA_TranslucentBackground,true);
setWindowFlags(Qt::Window|Qt::FramelessWindowHint|Qt::WindowSystemMenuHint
|Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);重载paintEvent
点击(此处)折叠或打开QPainter p(this);
p.drawRoundedRect(0,0,width()1,height()1,20,20);点击(此处)折叠或打开QPixmap pixmap(“:/p_w_picpaths/*.png”);
setMask(pixmap.mask());
QPalette palette;
palette.setBrush(QPalette::Background,QBrush(pixmap));
setPalette(palette);
resize(pixmap.size());
setMask(pixmap.mask());

相关推荐: 怎么开发基HTML5网络拓扑图的应用

这篇“怎么开发基HTML5网络拓扑图的应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么开发基HTML5网络拓扑图的应用”文章吧。用 HT …

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/23 17:14
Next 07/23 17:14

相关推荐