• 5823阅读
  • 5回复

QHBoxLayout,removeWidget不生效 [复制链接]

上一主题 下一主题
离线stlcours
 

只看楼主 倒序阅读 楼主  发表于: 2014-08-26

声明:
    QHBoxLayout *hboxProgress;
    QLabel *white_label;
    QProgressBar *remember_label;


构造函数里初始化:
    hboxProgress = new QHBoxLayout();
    hboxProgress->addWidget(white_label);
    hboxProgress->addStretch(1);
    hboxProgress->setSpacing(40);
    hboxProgress->setContentsMargins(0, 0, 0, 0);

    white_label = new QLabel();
    white_label->setFixedSize(160, 10);
    remember_label = new QProgressBar();
    remember_label->setFixedSize(160, 10);
    remember_label->setRange(0,100);      
    remember_label->setValue(0);

        m_state=false;


登录按钮对应的函数:

void LoginDialog::verify()
{
    if(!m_state)
    {
        title_label->setText(tr("test 111")); // 始终有效
        hboxProgress->removeWidget(white_label);
        hboxProgress->addWidget(remember_label); // 第一次切换有效,之后无效
        hboxProgress->invalidate(); // 加上仍无效
        hboxProgress->update();     // 加上仍无效
        m_state=true;
    }
    else
    {
        title_label->setText(tr("test 222")); // 始终有效
        hboxProgress->removeWidget(remember_label);
        hboxProgress->addWidget(white_label); // 问题在这里:从未生效(至少从未被显示)
        hboxProgress->invalidate(); // 加上仍无效
        hboxProgress->update();     // 加上仍无效
        m_state=false;
    }
}
其实我就是要做一个登录框,但是在验证用户数据的时候,显示一个进度条,否则就显示一个Label。但是QHBoxLayout里动态设置Widget的时候不成功,请各位大大指教,非常感谢!
离线kimtaikee

只看该作者 1楼 发表于: 2014-08-27
你show/hide不就行了?

离线chinkyy

只看该作者 2楼 发表于: 2014-08-27
我把你说的这个效果实现了,亲测无误.......
ui中把你说的white_label 和 remember_label放在同一个布局里,切换显示代码如下:
Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget)
{  
   ui->setupUi(this);
    flag = false;
    ui->horizontalLayout->removeWidget(ui->label); // hide the label init.    
    ui
->label->setVisible(false);
}


//这里我用一个槽来实现切换显示
void Widget::on_pushButton_clicked()  
{    
        if
(!flag)    
       {      
          
ui->horizontalLayout->removeWidget(ui->progressBar);
           ui->horizontalLayout->addWidget(ui->label);
           ui->progressBar->setVisible(false);      
          
ui->label->setVisible(true);    
        
}    
       else
    
       {        
           ui
->horizontalLayout->removeWidget(ui->label);
           ui->horizontalLayout->addWidget(ui->progressBar);
           ui->progressBar->setVisible(true);        ui->label->setVisible(false);    
       }
       flag = !flag;
}

离线stlcours

只看该作者 3楼 发表于: 2014-08-27
谢谢楼上,根据你的启发,我也加上了setVisible函数,原来是因为它的原因。不过这样够麻烦的,切换了还不够,还要手动更改控件的现实状况。不知道QT这样做有它的什么理由?不过作为一个开发出KDE的软件库,理应敬佩它,而不是怀疑。。。

PS,或许可以考虑使用QStackedLayout
离线roywillow

只看该作者 4楼 发表于: 2014-08-27
qlayout只是负责管理qwidget的大小、位置,不会去控制组件的可视与否的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线chinkyy

只看该作者 5楼 发表于: 2014-08-28
回 roywillow 的帖子
roywillow:qlayout只是负责管理qwidget的大小、位置,不会去控制组件的可视与否的 (2014-08-27 20:27) 

正解,
快速回复
限100 字节
 
上一个 下一个