Qt删除布局内的控件
来源:互联网 发布:rpg游戏 知乎 编辑:程序博客网 时间:2024/04/29 07:55
基于某些原因,我们可能希望往一个布局内动态删除和添加新的元素,添加我们都能很清楚得看到addWidget这个接口.删除的话官方也有示例:
QLayoutItem *child;
while(child=this->ui->centralWidget->layout()->takeAt(0)) {
delete child;
}
不知道是我个人理解的角度有问题还是怎么,我感觉就很奇怪,我添加一个widget的时候,是传入widget的指针,删除的时候是删除一个QLayoutItem的指针,读了半天的源代码才明白,在addWidget的时候,做了这样一些操作
void QLayout::addWidget(QWidget *w)
{
addChildWidget(w);
addItem(QLayoutPrivate::createWidgetItem(this, w));
}
先将传入的widget指针交给layout的所属widget,这样就实现了传入的widget成为了另一个widget的子widget,接着在删除父widget时会清理(析构)这个子widget.
void QLayout::addChildWidget(QWidget *w)
{
QWidget *mw = parentWidget();
QWidget *pw = w->parentWidget();
//Qt::WA_LaidOut is never reset. It only means that the widget at some point has
//been in a layout.
if (pw && w->testAttribute(Qt::WA_LaidOut)) {
QLayout *l = pw->layout();
if (l && removeWidgetRecursively(l, w)) {
#ifdef QT_DEBUG
if (layoutDebug())
qWarning("QLayout::addChildWidget: %s \"%s\" is already in a layout; moved to new layout",
w->metaObject()->className(), w->objectName().toLocal8Bit().data());
#endif
}
}
if (pw && mw && pw != mw) {
#ifdef QT_DEBUG
if (layoutDebug())
qWarning("QLayout::addChildWidget: %s \"%s\" in wrong parent; moved to correct parent",
w->metaObject()->className(), w->objectName().toLocal8Bit().data());
#endif
pw = 0;
}
bool needShow = mw && mw->isVisible() && !(w->isHidden() && w->testAttribute(Qt::WA_WState_ExplicitShowHide));
if (!pw && mw)
w->setParent(mw);
w->setAttribute(Qt::WA_LaidOut);
if (needShow)
QMetaObject::invokeMethod(w, "_q_showIfNotHidden", Qt::QueuedConnection); //show later
}
然后addItem是一个纯虚接口,createWidgetItem是一个工厂接口
QLayoutPrivate::QWidgetItemFactoryMethod QLayoutPrivate::widgetItemFactoryMethod = 0;QLayoutPrivate::QSpacerItemFactoryMethod QLayoutPrivate::spacerItemFactoryMethod = 0;QWidgetItem *QLayoutPrivate::createWidgetItem(const QLayout *layout, QWidget *widget){if (widgetItemFactoryMethod)if (QWidgetItem *wi = (*widgetItemFactoryMethod)(layout, widget))return wi;return new QWidgetItemV2(widget);}应该是依据相应的widget,生成相应的widgetItem(派生自QLayoutItem)
后面的就没继续读了
大意就是根据widget生成一个item加入到layout的item链表中.
接着删除的代码就能了解了,就是对这个item的链表进行清理,可以看到这个过程中没有涉及到widget的析构,所以layout清理完item之后,被加入到layout的widget没有析构掉,但这个时候原先加入进的子widget,这个时候其父widget并没有被恢复到之前的父widget.
0 0
- Qt删除布局内的控件
- 删除布局内的控件
- qt removeWidget(删除布局内…
- Qt删除layout的控件
- QT 学习笔记 窗口控件的布局
- Qt控件布局
- Qt 控件自动布局
- Winform界面布局-容器内的控件适应容器
- QT 内建控件概览
- QT 内建控件概览
- QT 内建控件概览
- QT 内建控件概览
- QT 内建控件概览
- QT 内建控件概览
- 如何开发一个Qt工具箱内的控件
- Qt布局管理之设置控件之间的间距
- Qt布局管理之设置控件之间的间距
- Qt布局经管之设置控件之间的间距
- MongoDB-OrderTransactions
- socket和http的区别
- SOLR的安装(实用部分讲解)
- Win7复制CMD窗口中的内容
- java只有值传递
- Qt删除布局内的控件
- 安卓开发_编辑框内容的增减
- //电话号码匹配问题
- Dubbo admin在JDK1.8环境运行报Invalid property 'URIType' of bean class
- jQuery.extend和jQuery.fn.extend的区别
- Yii配置主从同步,读写分离
- JavaSE_反射机制之Field的方法详解
- NP,NPC,P问题的概念
- 关于Android具体是什么对不熟悉领域的一些错误理解