首页 > 解决方案 > 没有孩子时 QT 小部件消失

问题描述

使用 Qt5,我正在尝试开发一个具有按列排列的小部件的应用程序。这些小部件由以下代码创建:

QWidget *area = new QWidget(centralWidget);
QHBoxLayout *layout = new QHBoxLayout(area);
for (int i=0; i<n; i++) {
  columns.push_back(new QWidget(area));
  layout->addWidget(columns[i]);
  layouts2.push_back(QVBoxLayout());
  labels.push_back(new QVector<QLabel *>);
  for (j=0; j<m; j++) {
    labels[i].push_back(new QLabel(columns[i]));
    layouts2[i]->addWidget(labels[i][j]);
  }
}

稍后,可以从列中添加或删除标签。删除标签的代码是:

QLabel *label = labels[i][j];
layouts2[i]->removeWidget(label);
delete label;
labels[i].pop_back();

最终,一列的所有标签都被删除。我曾希望,即使没有子组件,列小部件也能用作占位符,并像以前一样保留显示,在应该是空列的地方留一个空白。相反,该列从显示中消失,只出现 n-1 列。出了什么问题,我该如何解决?

标签: qtlayout

解决方案


目前尚不完全清楚您要实现的目标,但我怀疑问题出在QWidget::sizeHint...的默认实现上

QSize QWidget::sizeHint() const
{
    Q_D(const QWidget);
    if (d->layout)
        return d->layout->totalSizeHint();
    return QSize(-1, -1);
}

如果小部件具有布局,则sizeHint返回布局所需的大小,如果布局为空,则可能为QSize(0, 0).

如果您希望有问题的小部件即使在从其布局中删除所有项目后仍以某种方式可见,请尝试QWidget::setMinimumSize使用合适的值调用。


推荐阅读