自学内容网 自学内容网

Qt 控件与布局管理

1. Qt 控件的父子继承关系

在 Qt 中,继承自 QWidget 的类,通常会在构造函数中接收一个 parent 参数。

这个参数用于指定当前空间的父控件,从而建立控件间的父子关系。

当一个控件被设置为另一控件的子控件时,它会自动成为该父控件的一部分,且具备以下特性:

  • 子控件会随着父控件,一起显示或隐藏;

  • 子控件会被包含在父控件的几何布局中;

  • 当父控件被删除时,所有的子控件会被自动删除,防止内存泄漏。

// .h
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    QWidget* container;
}

// .cpp
SessionFriendArea::SessionFriendArea(QWidget *parent)
    : QScrollArea{parent}
{
    container = new QWidget();
    
    this->setWidget(container);
}

SessionFriendItem 的构造函数中, parent 被传递给 QScrollArea 的构造函数 —— 让 QScrollArea 成为父控件的一部分,从而正确地管理其生命周期和位置。

在构造函数体中,创建 container 并设置为 this 的子控件(即 QScrollArea 的子控件):

​ container 会随 QScrollArea 的 显示/隐藏 而 显示/隐藏;

​ container 的生命周期与 QScrollArea 绑定,当 QScrollArea 被销毁时,container 也会被自动销毁。

2. QWidget 和 QLayout

在 Qt 中,QWidgetQLayout 之间的关系是紧密且互补的。

理解它们的关系,对构建复杂的用户界面统至关重要。

2.1 QWidget 简介

QWidget 是所有界面对象的基类,代表了一个可以显示和交互的窗口部件(控件),如:按钮、标签、窗口。

每个 QWidget 可以有自己的几何属性(位置、大小)、样式、事件处理机制等。

2.2 QLayout 简介

QLayout 是一个抽象基类,用于管理一组 QWidget 的布局。

它的主要作用是,自动调整这些控件的位置和大小,以便它们能适应不同的窗口大小和分辨率。

常见的布局管理器:QVBoxLayoutQHBoxLayoutQGridLayout

2.3 QWidget 包含 QLayout

可以通过 QWidget::setLayout(QLayout*) 方法,将一个布局管理器设置给 QWidget ;

也可以通过 QWidget::Layout() 方法,获取 QWidget 内的布局。

QWidget* widget = new QWidget();
QVBoxLayout* layout = new QVBoxLayout();

QPushButton* btn1 = new QPushButton();
btn1->setText(QString("按钮1"));

QPushButton* btn2 = new QPushButton();
btn2->setText(QString("按钮2"));
    
layout->addWidget(btn1);
layout->addWidget(btn2);

widget->setLayout(layout); // 设置布局

当 QWidget 被赋予一个布局时,该布局会自动管理,所有添加到该该布局中的子控件的位置和大小。

2.4 QLayout 包含 QWidget

可以通过 QLayout::addWidget(QWidget*) ,将控件=添加到布局中;

也可以通过 QLayout::addLayout() 方法,将一个布局嵌套在另一个布局中,从而实现复杂的界面结构。

布局管理器会根据其规则(垂直排列、水平排列、网格排列等),自动调整这些控件的位置和大小。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget* widget = new QWidget();

    QVBoxLayout* mainlayout = new QVBoxLayout();
    QHBoxLayout* sublayout = new QHBoxLayout();

    QPushButton* btn1 = new QPushButton("按钮1");
    QPushButton* btn2 = new QPushButton("按钮2");
    QPushButton* btn3 = new QPushButton("按钮3");

    sublayout->addWidget(btn2);
    sublayout->addWidget(btn3);

    mainlayout->addWidget(btn1);
    mainlayout->addLayout(sublayout);

    widget->setLayout(mainlayout);
    widget->show();

    return a.exec();
}

3. Qt 控制窗口大小方法
  • setFixedSize() :设置控件的固定高度和宽度 —— 使得控件的大小,不会随窗口或布局管理器的变化而改变。

​ QPushButton* btn = new QPushButton();

​ btn->setFixedSize(QSize(50, 50));

  • setFixedWidth()setFixedHeight() :分别设置控件的固定宽度和高度。
  • setMinimunSize()setMaximunSize() :分别设置控件的最小尺寸和最大尺寸。
  • setSizePolicy() :设置控件的尺寸策略,定义了控件如何响应布局管理器的要求及窗口大小的变化.

​ Fixed 、Preferred 、Expanding

tips:

  1. 对于 QPushButton ,setFixedSize() 的作用是设置控件的大小;setIconSize() 的作用是设置控件图标的大小(在 setIcon() 后)。
  2. 大多数情况下,调用 setFixedSize() 等方法后,无需额外调用 setSizePolicy() 。
4. QScrollArea

QScrollArea 是一个用于显示可滚动内容的容器控件。

它允许用户通过滚动条,查看超出窗口可视范围的内容。

  • setWidgetResizable(bool resizable) :决定是否自动调整内部小部件的大小以适应窗口大小。
  • verticalScrollBar() :返回与 QScrollArea 关联的垂直方向上的滚动条。
  • horizontalScrollBar() :返回与 QScrollArea 关联的水平方向上的滚动条。

原文地址:https://blog.csdn.net/taduanlangan/article/details/145298879

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!