在布局中添加父控件后,如何将子控件居中对齐?

3
我创建了一个包含父部件的布局。在该父部件中,我创建了另一个部件。
我的代码类似于这样:
QGridLayout *layout = new QGridLayout();
QWidget *parentWidget = new QWidget();
layout->addWidget(parentWidget );
QWidget *childWidget = new QWidget(parentWidget);

图片描述

如何在父窗口中居中子窗口小部件?

问题在于,由于它在一个布局中,我们无法获取父窗口的真实大小。

3个回答

3

将子类放在父类的showEvent中。你可以使用一个bool标志来确保只有在父类第一次显示时才这样做。

void Parent::showEvent(QShowEvent *)
{
    if(_first_show)
    {
        _first_show = false;
        _child->move(this->rect().center() - _child->rect().center());
    }
}

证明它有效(红色为父元素,蓝色为子元素): enter image description here

谢谢您对我的耐心等待。我可以再问一件事吗?如果我按照这种方法,我需要为父部件创建一个类,对吗? - user2652023
1
@user2652023 如果可以的话,这是理想的选择,但你不必这样做。你可以使用事件过滤器,但这只会导致代码变得丑陋。 - thuga

2
您可以通过设置子窗口的固定大小并将其放置在父窗口的网格布局中来实现此操作。
QGridLayout *layout = new QGridLayout();
QWidget *parentWidget = new QWidget();
layout->addWidget(parentWidget );
QWidget *childWidget = new QWidget(parentWidget);
QGridLayout *parentLayout = new QGridLayout();
parentWidget->setLayout(parentLayout);
parentLayout->addWidget(childWidget);
childWidget->setFixedSize(/*some fixed size for child widget*/);

如何使用setFixedSize()将子窗口部件居中?谢谢。 - user2652023
@user2652023,网格布局将小部件放置在其单元格的中心,但如果您不设置固定大小,则子小部件的大小将与父级相同(减去边距)。 - Andrei R.
1
@user2652023 获取小部件的矩形,并从中获取中心somewidget->rect().center()。像child->move(parent->rect().center() - child->rect().center());这样的代码应该可以工作。 - thuga
如果你在父窗口的showEvent函数中完成此操作,它将完美无缺地运行。请参考我的答案。 - thuga
1
@user2652023,您还应该编辑您的问题并将所有额外信息放入其中,这些信息是您在此答案上留下的评论。 - thuga
显示剩余9条评论

0
如果您可以修改父窗口小部件的布局,那么您可以简单地将子窗口小部件放置在一个具有两侧间隔器的 QGridLayout 中。
QGridLayout *layout = new QGridLayout();
QWidget *parentWidget = new QWidget();
layout->addWidget(parentWidget);

QGridLayout *parentLayout = new QGridLayout(&parentWidget);
parentLayout->addItem(new QSpacerItem(0,0, QSizePolicy::Expanding, QSizePolicy::Expanding),0,0);
parentLayout->addItem(new QSpacerItem(0,0, QSizePolicy::Expanding, QSizePolicy::Expanding),2,2);
QWidget *childWidget = new QWidget();
parentLayout->addWidget(&childWidget, 1, 1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接