• 10030阅读
  • 10回复

[提问]怎样改变ui->widget 和 ui->stackedWidget的窗体透明度 [复制链接]

上一主题 下一主题
离线yiyaaixuexi
 

只看楼主 倒序阅读 楼主  发表于: 2011-09-13
我做了这样一个实验:


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




  得到的debug log  :



opalevel =  0  ui->widget opacity: 1
opalevel =  0  ui->stackedWidget opacity: 1
opalevel =  0  ui opacity  0.898039



......



opalevel =  8  ui->widget opacity: 1
opalevel =  8  ui->stackedWidget opacity: 1
opalevel =  8  ui opacity  0.0980392




事实证明,无法通过setWindowOpacity()方法来改变ui->widget 和 ui->stackedWidget的窗体透明度,那么我要怎么实现呢?


谢谢帮忙 望高手赐教

离线yiyaaixuexi

只看该作者 1楼 发表于: 2011-09-13
    到哪里发贴都无人问津 dbzhang 你去哪里了
离线dbzhang800

只看该作者 2楼 发表于: 2011-09-13
引用第1楼yiyaaixuexi于2011-09-13 14:07发表的  :
[表情]    到哪里发贴都无人问津 dbzhang 你去哪里了  


因为:
  1. void QWidget::setWindowOpacity(qreal opacity)
  2. {
  3.     Q_D(QWidget);
  4.     if (!isWindow())
  5.         return;
  6. //...

离线yiyaaixuexi

只看该作者 3楼 发表于: 2011-09-13
引用第2楼dbzhang800于2011-09-13 14:45发表的  :
因为:
[code]void QWidget::setWindowOpacity(qreal opacity)
{
.......

    那我该如何是好啊……
   这条路走不通了
离线roywillow

只看该作者 4楼 发表于: 2011-09-13
那种方法论来改变非窗口的组件的透明度是办不到的应该
我的做法是继承那个类然后把原来的paintEvent的代码复制到子类中,然后在绘制开头对painter的透明度进行设置
不过如果原来的类的绘制比较复杂可能不是很好办了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线yiyaaixuexi

只看该作者 5楼 发表于: 2011-09-13
引用第4楼roywillow于2011-09-13 17:23发表的  :
那种方法论来改变非窗口的组件的透明度是办不到的应该
我的做法是继承那个类然后把原来的paintEvent的代码复制到子类中,然后在绘制开头对painter的透明度进行设置
不过如果原来的类的绘制比较复杂可能不是很好办了

    原来的类绘制很复杂……哎……之前也有想过,可是是在是麻烦,不想重新绘制 ,希望另求他法
离线318065268
只看该作者 6楼 发表于: 2011-09-15
呵呵,有个比较搞的方法:把你想要做成透明的窗体父部件设为0,独立出来,然后设置成无边框。其位置的设定放在原本的父窗体的mouseMoveEvent里面实时设定。这里不能用layout了。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线yiyaaixuexi

只看该作者 7楼 发表于: 2011-09-17
自己解决了 分享下:
解决方案
离线roywillow

只看该作者 8楼 发表于: 2011-09-17
原来这个东西在QWidget上也能用啊,学习了……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线begboy

只看该作者 9楼 发表于: 2011-09-18
回 楼主(yiyaaixuexi) 的帖子
呵呵,茜MM也有问题问DBzhang呢?
你在我们心目中可是个神,女神!
离线yiyaaixuexi

只看该作者 10楼 发表于: 2011-09-18
Re:回 楼主(yiyaaixuexi) 的帖子
引用第9楼begboy于2011-09-18 16:50发表的 回 楼主(yiyaaixuexi) 的帖子 :
呵呵,茜MM也有问题问DBzhang呢?
你在我们心目中可是个神,女神!


dbzhang800  才是qt之神
快速回复
限100 字节
 
上一个 下一个