您的位置:首页 > 编程语言 > Qt开发

QT透明窗体子窗体显示

2015-12-03 00:11 615 查看
// In this function, we can get the height and width of the current widget

void Widget::resizeEvent(QResizeEvent *)

{

// Use a bitmap as a mask. A bitmap only has two kind of colors: white(value is 0)

// or black(other values). When we use it to set mask, we can see the window at the position

// where the color value is 0, and other place will be transparent.

QBitmap bitMap(width(),height()); // A bit map has the same size with current widget

QPainter painter(&bitMap);

painter.setPen(QColor(255,255,255)); // Any color that is not QRgb(0,0,0) is right

painter.drawRect(0,0,width(),height());

// Now begin to draw the place where we want to show it

painter.setPen(QColor(0,0,0));

drawTextOnWin(&painter);

drawImageOnWin(&painter);

setMask(bitMap);

}

void Widget::paintEvent(QPaintEvent *)

{

QPainter painter(this);

painter.setPen(QColor(Qt::red));

// As the place where we want to draw has been set opaque in the resizeEvent, so what we draw here

// will be shown

drawTextOnWin(&painter);

drawImageOnWin(&painter);

}

void Widget::drawTextOnWin(QPainter *painter)

{

painter->setFont(QFont(font().family(),15));

painter->drawText( (width()-300)/2,0,300,50,Qt::AlignHCenter,"Now you can see me!");

}

void Widget::drawImageOnWin(QPainter *painter)

{

QPixmap imageTest(":/imageItem/pngImage.png");

painter->drawPixmap( (width()-imageTest.width())/2, (height()-imageTest.height())/2,

imageTest.width(), imageTest.height(), imageTest );

}

上面是源码。下面是效果图。



Qt提供了setOpacity的函数,但是使用之后,窗体所有子控件都变成同样的透明色了。

这里我们利用setMask()函数,以QBitmap为参数,通过对QBitmap做精细的操作(关键在于QBitmap支持用painter直接在上面绘制),最终达到这样的效果:我们想要透明的地方变成透明,我们想要放置部件的地方变成非透明可见的。这样就达到了我们想要的效果。

具体实现的方法也很简单:如果你想在paintEvent里面绘制任何内容,也要同时在QBitmap上做绘制,前提是在QBitmap上绘制的时候画笔的rgb设置成QRgb(0,0,0)。

道理我已经讲明白了。大家可以自己把代码弄到自己的类里面实验一下。

例子中只是最简单的演示,按照这个思路我想可以做出更多更灵活的应用的,比如可以让窗体介于透明和非透明之间(这里需要准备一个对应的透明色的png图片,或者使用相应的Qt函数来做都行)。最关键的是这种方法下透明度的操作不会影响到子控件的。

FROM: http://www.linuxidc.com/Linux/2011-07/39020.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: