首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >布局sizeHint qwidget

布局sizeHint qwidget
EN

Stack Overflow用户
提问于 2012-06-19 00:11:34
回答 1查看 14.7K关注 0票数 4

我正在创建一个小部件,其中包含一个国际象棋表和6个按钮,它们显示在国际象棋表下面的2行中。按钮行比国际象棋桌宽。棋桌和按钮都在一个QGridLayout中。国际象棋桌有它自己的sizeHint,是根据方块的大小计算出来的。

在一些操作之后,我删除了按钮,并将包含所有内容的小部件的大小调整为其sizeHint (resize(sizeHint()))。小部件在垂直方向上可以正确地调整大小,但在水平方向上,它保持与按钮行一样宽。问题出在哪里?

如果我仅使用国际象棋桌构造小部件,布局将适当地调整小部件的大小。

我正在添加以下代码:

在窗口的构造函数中:

代码语言:javascript
复制
renderArea = new RenderArea(m_row,m_col,m_grid);

formLayout = new QGridLayout;

formLayout->addWidget(renderArea,0,0,1,3);

setLayout(formLayout);

在添加按钮的函数中:

代码语言:javascript
复制
addPlaneButton = new QPushButton(tr("Add plane"));
cancelButton = new QPushButton(tr("Cancel operation"));
movePlaneButton = new QPushButton(tr("Move plane"));
deletePlaneButton = new QPushButton(tr("Delete plane"));
rotatePlaneButton = new QPushButton(tr("Rotate plane"));
doneButton = new QPushButton(tr("Done"));
doneButton->setEnabled(false);

infoLabel = new QLabel(tr("Welcome to the plane editor"));
statusLabel = new QLabel();

formLayout->addWidget(statusLabel,1,0,1,3);
formLayout->addWidget(infoLabel,2,0,1,3);
formLayout->addWidget(addPlaneButton,3,0);
formLayout->addWidget(movePlaneButton,3,1);
formLayout->addWidget(deletePlaneButton,3,2);
formLayout->addWidget(rotatePlaneButton,4,0);
formLayout->addWidget(cancelButton,4,1);
formLayout->addWidget(doneButton, 4,2);

在删除国际象棋桌以外的所有东西的函数中:

代码语言:javascript
复制
formLayout->removeWidget(addPlaneButton);
formLayout->removeWidget(cancelButton);
formLayout->removeWidget(movePlaneButton);
formLayout->removeWidget(deletePlaneButton);
formLayout->removeWidget(rotatePlaneButton);
formLayout->removeWidget(doneButton);
formLayout->removeWidget(infoLabel);
formLayout->removeWidget(statusLabel);


delete addPlaneButton;
delete cancelButton;
delete movePlaneButton;
delete deletePlaneButton;
delete rotatePlaneButton;
delete doneButton;


delete infoLabel;
delete statusLabel;

resize(sizeHint());

国际象棋桌的sizeHint计算如下:

代码语言:javascript
复制
return QSize(m_rowNo*spacing, m_colNo*spacing)+QSize(31,31);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-19 06:40:49

  1. 您必须在此之前对布局进行activate(),以便在修改布局的小部件后立即更新其sizeHint()以及随后的小部件的sizeHint()
  2. layout->removeWidget()的调用是多余的。只需对不需要的小部件执行delete操作。Qt处理QWidget层次结构中的所有内存分配。在Qt端不告诉任何人的情况下删除QWidget是安全的。当然,也有一些合理的例外:例如,您不能删除其方法在调用堆栈上的小部件。
  3. 如果您不想麻烦地调用resize(),则可以在小部件的布局上设置适当的大小约束。例如:

layout->setSizeConstraint(QLayout::SetFixedSize);

这确保了小部件自身的大小仅足以容纳每个sizeHint().的内容

考虑到第1点和第2点,‘删除棋盘以外的所有东西’的函数可能如下所示:

代码语言:javascript
复制
void removeButtons() {
    delete addPlaneButton;
    delete cancelButton;
    delete movePlaneButton;
    delete deletePlaneButton;
    delete rotatePlaneButton;
    delete doneButton;
    delete infoLabel;
    delete statusLabel;

    formLayout->activate();
    resize(sizeHint());
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11086801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档