gpt4 book ai didi

qt - 布局 sizeHint qwidget

转载 作者:行者123 更新时间:2023-12-04 13:12:36 29 4
gpt4 key购买 nike

我正在创建一个小部件,其中包含一个国际象棋 table 和六个按钮,这些按钮显示在国际象棋 table 下方的 2 行中。按钮行比棋盘宽。国际象棋表和按钮位于 QGridLayout 中。 Chess table 有自己的 sizeHint,它是根据方格的大小计算出来的。

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

如果我仅使用国际象棋表构建小部件,则布局会正确调整小部件的大小。

我正在添加代码:

在窗口的构造函数中:

renderArea = new RenderArea(m_row,m_col,m_grid);

formLayout = new QGridLayout;

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

setLayout(formLayout);

在添加按钮的函数中:
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);

在删除国际象棋表之外的所有内容的函数中:
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 计算如下:
return QSize(m_rowNo*spacing, m_colNo*spacing)+QSize(31,31);

最佳答案

  • 您必须 activate()sizeHint() 之前的布局,然后是小部件的 sizeHint() ,在修改布局的小部件后立即更新。
  • 调用 layout->removeWidget()是多余的。只需delete不需要的小部件。 Qt 处理 QWidget 层次结构中的所有内存分配。删除 QWidget 而不告诉 Qt 端的任何人是安全的。当然也有正常的异常(exception):例如,您不能删除其方法位于调用堆栈中某处的小部件。
  • 如果您不想打扰调用resize() ,您可以在小部件的布局上设置适当的大小约束。例如:
    layout->setSizeConstraint(QLayout::SetFixedSize);
    这确保了小部件的大小仅足以容纳sizeHint() 中的内容。 .

  • 考虑到第 1 点和第 2 点,“删除棋盘以外的所有内容”的函数可能如下所示:
    void removeButtons() {
    delete addPlaneButton;
    delete cancelButton;
    delete movePlaneButton;
    delete deletePlaneButton;
    delete rotatePlaneButton;
    delete doneButton;
    delete infoLabel;
    delete statusLabel;

    formLayout->activate();
    resize(sizeHint());
    }

    关于qt - 布局 sizeHint qwidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086801/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com