QWidget 调整大小问题

Posted

技术标签:

【中文标题】QWidget 调整大小问题【英文标题】:QWidget resizing problems 【发布时间】:2014-05-04 13:12:11 【问题描述】:

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

小部件A 是带有QHBoxLayout 的容器,用于QLabel 对象。我想把这样的小部件放在其他小部件中,恒定高度等于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()。实际上,我得到了比A 更大的、完全可调整大小的窗口。 A 已冻结,不会使用 B 调整大小。

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

我怎样才能做到这一点?

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

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

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

【问题讨论】:

【参考方案1】:

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

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

您需要将 A 的大小策略更改为 Expanding 或 Prefered 或尝试其他一些策略。您可以在设计器中对此进行测试,当您对结果感到满意时,您可以获得正确的属性并在代码中设置它们。

【讨论】:

以上是关于QWidget 调整大小问题的主要内容,如果未能解决你的问题,请参考以下文章

QWidget - 调整动画大小

Qt QStackedWidget 调整大小问题

调整大小的 opencv 图像在 QWidget C++ 上未正确显示

在调整大小期间保持子类 QWidget 的纵横比

调整 QDialog 的大小作为 MainWindow 调整大小

QQuickView 内容未正确调整大小