QWidget调整问题的大小

时间:2014-05-04 13:12:11

标签: c++ qt qt5 qwidget

我因为以下问题而奋斗了几个小时。

小部件AQHBoxLayoutQLabel个对象的容器。我想将这样的小部件放在其他小部件中,其高度恒定等于A的高度,最小宽度等于A的宽度(但宽度可以更改)。

A构造函数中,我有以下代码:

QHBoxLayout* mLayout = new QHBoxLayout();
for (auto e : wordsList)
    mLayout->addWidget(e);
mLayout->setSpacing(0);
mLayout->setMargin(0);
mLayout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(mLayout);

还有B的正文:

class B : public QWidget
{
    Q_OBJECT
public:
    explicit B(A *a0, QWidget *parent = 0)
        : QWidget(parent),
          a(a0)
    {
        a->setParent(this);
        setSizePolicy(QSizePolicy());
        setFixedSize(sizeHint());
    }
    QSize minimumSize() const
    {
        return a->size();
    }
    QSize sizeHint() const
    {
        return minimumSize();
    }
private:
    A *a;
};

main()我在B的实例上调用show()。实际上,我得到一个大的,可完全调整大小的窗口,大于AA被冻结,不会使用B调整大小。

我希望B以与A相同的尺寸开始,并且只能水平调整大小(但最小宽度等于A)。

我怎样才能做到这一点?

为什么setSizePolicy()setFixedSize()minimumSize()甚至sizeHint()不起作用?

这可能是因为我使用B作为主窗口吗?

如果我在B中使用布局,则可能应该是另一个QHBoxLayout。但是当他有太多的空间时,他适合他的组件,所以我需要使用QSpacerItem并在B调整大小时始终调整他的大小。但是我不知道顺序,小部件正在接收QResizeEvent:如果B在我的间隔符之前得到它,我将什么都不做。我可能会使用eventFilter,但是,这太复杂了(我需要的行为非常简单!)。

1 个答案:

答案 0 :(得分:1)

我认为没有必要继承B你只需在B中添加一个布局并将A添加到布局中:

QWidget * widgetB = new WhateverWidgetYouWant();
QHBoxLayout* layoutForB = new QHBoxLayout();
widgetB->setLayout(mLayout);
layoutForB->addWidget(pointerToA);

您需要的是将A的大小政策更改为“扩展”或“已暂存”或尝试使用其他一些策略。您可以在设计器中对此进行测试,当您对结果感到满意时,您可以获得正确的属性并在代码中进行设置。