2013-08-28 10:40:37
分类: Windows平台
/**********************************转载分割线**********************************/
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 ("venus--TitleBar {background-color: rgb(0,0,0);color: rgb(255,255,255);}");
或
点击(此处)折叠或打开
- this->setObjectName("pw");//
设置对象句,相当于css里的id - this->setStyleSheet("#pw {border-image: 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);
终于把qt半透明搞定了
本文来自: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 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
将窗口嵌入桌面
ps:这儿用上了前面一文提到的函数findDesktopIconWnd()。
本文来自:http://mypyg.blog.51cto.com/820446/263369
一、将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.1
点击(此处)折叠或打开
- w.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。
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));
- }
用一个带有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运行不正常。窗口成为黑色背景块。只能是颜色半透明了。
还有就是图标会被盖住。只能把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的构造函数里添加如下几句:
点击(此处)折叠或打开
- 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);
//四个角都是圆弧 - //只要上边角圆弧
- int arcR = 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);
3.背景图片
点击(此处)折叠或打开
- QPixmap pixmap(":/images/*.png");
- setMask(pixmap.mask());
- QPalette palette;
- palette.setBrush(QPalette::Background, QBrush(
pixmap ) );
- setPalette(palette);
- resize( pixmap.size()
); - setMask(pixmap.mask());
同样的一个setMask();在三个不同的平台上区别倒是很大,很是奇怪。