• 14669阅读
  • 8回复

QT中动态更新控件的问题。(已解决,感谢大家的讨论) [复制链接]

上一主题 下一主题
离线xiaobinl989
 

只看楼主 倒序阅读 楼主  发表于: 2010-03-28
我想要根据文件中的内容来更新窗口的布局。
我是否可以删除一个窗口的布局,然后再重新进行布局?
我设置一个名为UPDATE的按钮,我的槽函数应该怎么写,才能把窗口重新布局。
有没有这样的函数,可以把指定窗口的布局删除。例如 Wideget->DelateLayout();?
然后我再重新布局?
大侠指条路。
[ 此帖被xiaobinl989在2010-03-29 14:54重新编辑 ]
有斗志的小笔是无敌的。
离线xiaobinl989

只看该作者 1楼 发表于: 2010-03-28
或者是能把布局清空,让我重新布局的也行。
有斗志的小笔是无敌的。
离线xtfllbl

只看该作者 2楼 发表于: 2010-03-29
这个不难办吧,你自己的布局自己删除,然后再更具条件建立新的布局就是了。
请不要使用designer,那样不利于编写你这样的程序。
上海欢迎您
离线yangfanxing
只看该作者 3楼 发表于: 2010-03-29
引用第2楼xtfllbl于2010-03-29 09:54发表的  :
这个不难办吧,你自己的布局自己删除,然后再更具条件建立新的布局就是了。
请不要使用designer,那样不利于编写你这样的程序。


QLayout::removeWidget;
removeItem;
如果只要改变布局中的部件的话可以这样。不一定说不能用Designer,只要你获得了Designer中的控件指针也可。

删除layout的话。。。楼下接着说,呵呵。。。
PHPWind好恶心。。。不想看这种界面。。。
离线benbenmajia

只看该作者 4楼 发表于: 2010-03-29
如果必须这样来的话就没什么了,总觉得这样子很麻烦,你的构造函数岂不是要一遍又一遍的调用
安然.....
离线xiaobinl989

只看该作者 5楼 发表于: 2010-03-29
我用这样的方法解决了一下。
我试验发现,用delete删除布局之后,布局上的控件不会消失,所以,我改用了一个QFRAME来装载这个布局,再把这整个QFRAME删掉,再重新构造窗口。
这样的状况下,是可以完成一次更新了。
但是我要再次更新的时候,如何删除之前新创建出来的控件呢?
我是否可以让QFRAME作为子控件,然后通过父窗口来找到他并删除?具体是哪个函数?
有斗志的小笔是无敌的。
离线xiaobinl989

只看该作者 6楼 发表于: 2010-03-29
首先谢谢大家的帮忙。能大家的帮助来一起讨论真是太开心了。
经过一个多小时的参考和实验,我终于找到了解决办法。是这样的。
我建立一个例如Qvector<QPushButton*> v的对象列表
在创建的时候 分别将所创建的对象加入这个对象中。不对类型的对象,用不同类型的列表。
然后在需要更新的时候,循环删除列表中的对象。最后进行重新绘制。
vector<object*>::iterator i;
    i = v.begin();
    while(i!=v.end())
{    
        delete *i;
        i++;    
}
v.clear();

build();//自己写的重新布局函数。

这样就完成重新布局了。
再次感谢大家。。
有斗志的小笔是无敌的。
离线benbenmajia

只看该作者 7楼 发表于: 2010-03-29
不错
安然.....

只看该作者 8楼 发表于: 2012-09-03
引用第6楼xiaobinl989于2010-03-29 14:51发表的  :
首先谢谢大家的帮忙。能大家的帮助来一起讨论真是太开心了。
经过一个多小时的参考和实验,我终于找到了解决办法。是这样的。
我建立一个例如Qvector<QPushButton*> v的对象列表
在创建的时候 分别将所创建的对象加入这个对象中。不对类型的对象,用不同类型的列表。
然后在需要更新的时候,循环删除列表中的对象。最后进行重新绘制。
.......





对以上的程序优化一下:
头文件声明一下:
QList <QToolButton *> appList;


    //找出要被删除的button    QToolButton *tmpBtn;    for(int i = 0; i < appList.size(); i++)    {        tmpBtn = appList.at(i);        if(tmpBtn->objectName() == sAppName)        {            qDebug() << "find and delete";            appList.removeAt(i);            delete tmpBtn;            tmpBtn = NULL;            return; //如果找到就不继续找了        }    }    tmpBtn = NULL;
快速回复
限100 字节
 
上一个 下一个