Qt :非window子窗体的透明度设置

这个是个好文章啊啊,自己试了几百次都没有成功,还好找到了这个文章


连接地址:http://www.kuqin.com/cpluspluslib/20110917/264886.html



问题的由来

心血来潮,想利用QTimer 配合setWindowOpacity()方法来实现一个窗体淡入的效果。

实验代码

粗糙的实验代码:

  1. voidWidget::on_pushButton_clicked()
  2. {
  3. QTimer*timerOpacity=newQTimer(this);
  4. connect(timerOpacity,SIGNAL(timeout()),this,SLOT(changeOpacity()));
  5. timerOpacity->start(100);
  6. }
  7.  
  8. voidWidget::changeOpacity()
  9. {
  10. if(opalevel>8)return;
  11. doubleopacity[9]={0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1};
  12. ui->stackedWidget->setWindowOpacity(opacity[opalevel]);
  13. ui->widget->setWindowOpacity(opacity[opalevel]);
  14. this->setWindowOpacity(opacity[opalevel]);
  15.  
  16. qDebug()<<"opalevel="<<opalevel<<"ui->widgetopacity:"<<ui->widget->windowOpacity();
  17. qDebug()<<"opalevel="<<opalevel<<"ui->stackedWidgetopacity:"<<ui->stackedWidget->windowOpacity();
  18. qDebug()<<"opalevel="<<opalevel<<"uiopacity:"<<this->windowOpacity()<<endl;
  19. }

实验失败

现象是主窗体的有淡入的效果,即透明度有变化,但是子窗体没有,opacity始终为1。

Log :

opalevel =0ui->widget opacity: 1
opalevel =0ui->stackedWidget opacity: 1
opalevel =0ui opacity0.898039
......

opalevel =8ui->widget opacity: 1
opalevel =8ui->stackedWidget opacity: 1
opalevel =8ui opacity0.0980392
 

失败原因
  1. voidQWidget::setWindowOpacity(qrealopacity)
  2. {
  3. Q_D(QWidget);
  4. if(!isWindow())
  5. return;
  6. //...
  7. }

解决方案

QGraphicsOpacityEffect

  1. //intheconstructor
  2. opacityEffect=newQGraphicsOpacityEffect;
  3. ui->widget->setGraphicsEffect(opacityEffect);
  4. ...
  5. //inchangeOpacity()
  6. opacityEffect->setOpacity(opacity[opalevel]);

效果图





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值