• 怎么将Widget调整为自适应大小?

要将Qt中的Widget调整为自适应大小,可以通过以下步骤实现:

为Widget设置自适应大小属性:将QWidget的sizePolicy设置为QSizePolicy::Expanding,可以使Widget在布局中自适应大小,如下所示:

QWidget *widget = new QWidget();
widget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

在Widget的resizeEvent()事件中重新布置控件:当Widget的大小发生变化时,会触发resizeEvent()事件。可以在事件处理函数中重新布置Widget中的子控件,使它们适应新的大小,如下所示:

void MyWidget::resizeEvent(QResizeEvent *event)
{
    //重新设置子控件的大小和位置
    //...
} 

当Widget的内容改变时,通过调用updateGeometry()函数,通知布局管理器重新计算大小,如下所示:

void MyWidget::updateContent()
{
    //更新Widget的内容
    //...

    //调用updateGeometry()函数,通知布局管理器重新计算大小
    updateGeometry();
}

通过以上步骤,即可实现Qt中Widget的自适应大小。

  • 可以在设计模式下调整吗?

当在Qt Designer中设计Widget时,也可以通过设置Widget的sizePolicy属性为QSizePolicy::Expanding来实现自适应大小。

选择要调整的Widget,并在Qt Designer的属性编辑器中选择sizePolicy属性。

将水平和垂直方向的sizePolicy属性都设置为QSizePolicy::Expanding。

在布局中使用该Widget时,可以通过调整布局中其他控件的大小,来间接影响该Widget的大小。

注意:如果该Widget内部有子控件,并且这些子控件没有设置正确的布局,可能会导致自适应大小失效。这时需要在子控件中按以上方法设置sizePolicy属性,并正确设置布局。

  • 解释一下QSizePolicy的参数都是什么意思

QSizePolicy(大小策略)是Qt中的一个类,用于控制控件在父容器中的大小和行为。

在Qt中,QSizePolicy可以通过两组数据(水平和垂直)来控制控件的大小和行为,每组数据包含如下5个参数:

Policy(尺寸策略):用于控制控件在父容器中的大小。可以设置为固定大小(Fixed)、可变大小(Minimum/Maximum)、自适应大小(Preferred)或者扩展(Expanding)。

Stretch(拉伸):用于控制控件在父容器中的相对大小。可以设置相对大小(Relative)、拉伸比例(Grow/Shrink)或者不拉伸(Fixed)。

Control Type(控制类型):用于控制父容器如何扩展之后,分配额外的空间。可以设置为静态分配(Default)、按比例分配(SizePolicy::Ignored)、优先分配给该控件(SizePolicy::Preferred)、尽量避免分配给该控件(SizePolicy::Minimum)或者尽量均分(SizePolicy::Expanding)。

Vertical Policy(垂直方向的大小策略):用于控制垂直方向上控件的大小和行为。

Horizontal Policy(水平方向的大小策略):用于控制水平方向上控件的大小和行为。

例如,以下代码创建了一个QHBoxLayout布局,并设置了两个button控件的sizePolicy,使它们可以自适应大小并在布局中占据相同的宽度空间。其中,水平和垂直方向的尺寸策略和拉伸都设置为了Expanding:


QHBoxLayout *layout = new QHBoxLayout();

QPushButton *button1 = new QPushButton("Button1");
QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy1.setHorizontalStretch(1);
button1->setSizePolicy(sizePolicy1);

QPushButton *button2 = new QPushButton("Button2");
QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy2.setHorizontalStretch(1);
button2->setSizePolicy(sizePolicy2);

layout->addWidget(button1);
layout->addWidget(button2);

setLayout(layout);

在以上示例中,Expanding表示该控件可以扩展到任意大小;setHorizontalStretch(或setVerticalStretch)被用来控制控件在父容器中的相对尺寸。在此例中,setHorizontalStretch被设置为1,表示button1和button2在布局中占据相同的宽度空间。

  • 那么想要自适应大小的效果,为什么不使用Preferred,反而使用Expanding?
    在Qt中,Preferred(自适应大小)和Expanding(扩展)在某些方面的表现是相似的,但也有一些区别。

Preferred(自适应大小):该控件在显示时会尽可能地满足其内容所需的最小大小,但不会拉伸或扩展到超过该大小。因此,如果控件中的内容可以适应其父容器的大小,则此尺寸策略可能很有用。

Expanding(扩展):该控件在父容器可用空间增大时可以扩展,并且当控件不得不缩小以适应较小的父容器时,也会缩小。因此,它可以被用来自适应任何给定的父容器大小。

因此,如果您只需要控件能够在父容器尺寸变化时自适应,而不是以最小空间显示控件内容(例如当控件中包含大量数据时),Expanding可能是更好的选项。此时,控件可以随着其父容器的大小而动态调整大小,并用满足布局的方式填充可用空间。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐