从 QSplitter 中删除小部件

Posted

技术标签:

【中文标题】从 QSplitter 中删除小部件【英文标题】:Remove Widget from QSplitter 【发布时间】:2013-12-02 12:31:14 【问题描述】:

很久以前,有人问过同样的问题。 How to remove...

这就是答案:

当你 hide() 一个孩子时,它的空间将分配给其他孩子。当您再次显示()时,它将恢复。

我已经尝试过QSplitter::hide()show()update() 函数以及delete。 没有任何效果。

//class.cpp

void PlainView::addComponent(QWidget *widget)

  qDebug() << _splitOne->widget(1);

  //delete current widget on index 1
  delete _splitOne->widget(1);
  //add new widget on index 1
  _splitOne->addWidget(widget);

  qDebug() << _splitOne->widget(1);


//output
QObject(0x0)  
QTextEdit(0xa0f580

第一个小部件被删除并添加了新小部件。但是我看不到新的小部件。

有人有想法吗?

【问题讨论】:

【参考方案1】:

不要使用删除,而是使用deleteLater(),您需要先删除旧的小部件:

void PlainView::addComponent(QWidget *widget)

  qDebug() << _splitOne->widget(1);
  QWidget *old = _splitOne->widget(1);

  // deparenting removes the widget from the gui
  old->setParent(0);
  //delete current widget on index 1
  old->deleteLater()

  //add new widget on index 1
  _splitOne->insertWidget(1,widget);
  widget->show();

  qDebug() << _splitOne->widget(1);

【讨论】:

我已经测试了你的代码,但我得到了以下异常:QObject(0x0) The program has unexpectedly finished.我的编译器不支持auto消息:warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat] 这行惹麻烦setParent(NULL); old->setParent(0) 抛出同样的异常The program has unexpectedly finished,对不起;(

以上是关于从 QSplitter 中删除小部件的主要内容,如果未能解决你的问题,请参考以下文章

一个 QSplitter 并找到当前的小部件

QSplitter 显示两个小部件之间的分隔线或边距

QSplitter 未正确设置大小

在 QSplitter 中带有 QWidget 的 QScrollArea

在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,使得滚动条出现

如何通过 qt 设计器创建 QSplitter ui 类?