QT透明父窗体,显示子窗体

转自:http://www.linuxidc.com/Linux/2011-07/39020.htm

// In this function, we can get the height and width of thecurrent widget
void Widget::resizeEvent(QResizeEvent *)
{
    // Use abitmap as a mask. A bitmap only has two kind of colors: white(valueis 0)

 

      // orblack(other values). When we use it to set mask, we can see thewindow at the position
      // where thecolor value is 0, and other place will be transparent.
      QBitmapbitMap(width(),height()); // A bit map has the same size withcurrent widget
      QPainterpainter(&bitMap);
      painter.setPen(QColor(255,255,255)); // Any color that is notQRgb(0,0,0) is right
      painter.drawRect(0,0,width(),height());

    // Nowbegin 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 *)
{
    QPainterpainter(this);
   painter.setPen(QColor(Qt::red));
    // As theplace where we want to draw has been set opaque in the resizeEvent,so what we draw here
    // will beshown
   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 seeme!");
}
void Widget::drawImageOnWin(QPainter *painter)
{
    QPixmapimageTest(":/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函数来做都行)。最关键的是这种方法下透明度的操作不会影响到子控件的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值