一. 背景刷成黑色,前景色设为白色。 方法一、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(); QRgb *rgbpos1 = image.colorTable(); for( int y = 0; y < 80; y++ ) #if 1 red = k * red + ( 1 - k ) * bgred;
grabPixmap.convertFromImage( image ); zz: http://hi.baidu.com/sszllx/blog/item/ab833a59ea98622f2934f001.html Qt实现嵌入桌面的半透明窗口 这儿用上了前面一文提到的函数findDesktopIconWnd()。 class Dialog : public QDialog
{ public: } Dialog::Dialog(QWidget *parent)
{ } Dialog::~Dialog() { } int main(int argc, char *argv[])
{ } 有个窗口嵌入了桌面。按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();
但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。 3.3转战paintEvent() protected:
void Dialog::paintEvent(QPaintEvent *e)
{ } 3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent() 运行效果: 得到了设想中的效果。 最终的主函数代码: int main(int argc, char *argv[])
{ } Dialog::Dialog(QWidget *parent)
{ } Dialog::~Dialog() { } void Dialog::paintEvent(QPaintEvent *e) { }
在QT中自绘控件的方法说明 收藏 litterflybug的专栏 ::http://blog.csdn.net/litterflybug/archive/2009/05/07/4157482.aspx QT官方FAQ: http://www./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 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)
|
|
来自: qinjianguo18 > 《QT》