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 中,QWidget
和 QLayout
之间的关系是紧密且互补的。
理解它们的关系,对构建复杂的用户界面统至关重要。
2.1 QWidget 简介
QWidget
是所有界面对象的基类,代表了一个可以显示和交互的窗口部件(控件),如:按钮、标签、窗口。
每个 QWidget
可以有自己的几何属性(位置、大小)、样式、事件处理机制等。
2.2 QLayout 简介
QLayout
是一个抽象基类,用于管理一组 QWidget
的布局。
它的主要作用是,自动调整这些控件的位置和大小,以便它们能适应不同的窗口大小和分辨率。
常见的布局管理器:QVBoxLayout
、QHBoxLayout
、QGridLayout
。
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:
- 对于 QPushButton ,setFixedSize() 的作用是设置控件的大小;setIconSize() 的作用是设置控件图标的大小(在 setIcon() 后)。
- 大多数情况下,调用 setFixedSize() 等方法后,无需额外调用 setSizePolicy() 。
4. QScrollArea
QScrollArea
是一个用于显示可滚动内容的容器控件。
它允许用户通过滚动条,查看超出窗口可视范围的内容。
setWidgetResizable(bool resizable)
:决定是否自动调整内部小部件的大小以适应窗口大小。verticalScrollBar()
:返回与QScrollArea
关联的垂直方向上的滚动条。horizontalScrollBar()
:返回与QScrollArea
关联的水平方向上的滚动条。