QT6(常用界面组件的使用和布局管理)
QT
常用界面组件的使用
QWidget是所有界面组件的直接或间接父类
widget组件
:所有界面组件的统称,它从操作系统接收鼠标,键盘和其他事件,并在屏幕上显示自己,每个组件都是矩形的,并且按z轴顺序排列
windows
:没有嵌入到父组件中的组件,通常,它有一个frame和一个标题栏,可以使用window frame创建没有这两个装饰的窗口。在Qt中,QMainWindow和QDialog的各种子类是最常见的windows类型
按钮类型组件
继承关系结构图
QWidget类的主要属性和接口函数
- sizePolicy (type:QSizePolicy)
QSizePolicy类用于描述布局中的水平和垂直大小调整策略。它包含两个枚举值(垂直、水平)其值是枚举类型QSizePolicy:policy,还包含stretch值
控制控件在布局中的大小调整行为,通过 QSizePolicy::setHorizontalPolicy()
和 QSizePolicy::setVerticalPolicy()
设置
值 (枚举常量) | 描述 | 典型应用场景 |
---|---|---|
Fixed | 控件大小固定为 sizeHint() ,不可拉伸或收缩 | 标签、图标等固定大小元素 |
Minimum | sizeHint() 是控件的最小大小,可拉伸但不可收缩 | 按钮、输入框等 |
Maximum | sizeHint() 是控件的最大大小,可收缩但不可拉伸 | 工具栏等限制最大宽度的元素 |
Preferred | 控件首选 sizeHint() 大小,既可拉伸也可收缩 | 大多数控件的默认策略 |
Expanding | 首选 sizeHint() ,但会主动争取额外空间(比 Preferred 更高优先级) | 文本编辑器、表格等 |
MinimumExpanding | 同 Minimum ,但会主动争取额外空间 | 进度条等 |
Ignored | 完全忽略 sizeHint() ,按可用空间自由调整 | 占位符或特殊布局情况 |
QWidget作为窗口时的一些函数和属性
属性名 | 类型/返回值 | 说明
------------------------------
enabled bool 控件是否启用 (setEnabled())
visible bool 是否可见 (setVisible())
geometry QRect 位置和大小 (setGeometry())
windowTitle QString 窗口标题 (setWindowTitle())
windowOpacity qreal 透明度 0.0~1.0 (setWindowOpacity())
sizePolicy QSizePolicy 布局大小策略 (setSizePolicy())
focusPolicy Qt::FocusPolicy 焦点获取方式 (setFocusPolicy())// 位置和大小
void move(int x, int y); // 设置位置
void resize(int w, int h); // 设置大小
QRect frameGeometry() const; // 包含窗口装饰的几何体// 坐标转换
QPoint mapToGlobal(const QPoint &pos); // 控件坐标 → 屏幕坐标
QPoint mapFromGlobal(const QPoint &pos);// 屏幕坐标 → 控件坐标// 样式表
void setStyleSheet(const QString &styleSheet);// 字体和调色板
void setFont(const QFont &font);
void setPalette(const QPalette &palette);// 光标
void setCursor(const QCursor &cursor); // 设置鼠标悬停样式// 事件重写(需子类化)
void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void resizeEvent(QResizeEvent *event) override;// 事件过滤
void installEventFilter(QObject *filterObj);
bool eventFilter(QObject *watched, QEvent *event) override;// 父子层级
void setParent(QWidget *parent); // 设置父控件
QWidget *parentWidget() const; // 获取父控件// 布局
void setLayout(QLayout *layout); // 设置布局管理器
QLayout *layout() const; // 获取布局void setFocus(); // 强制获取焦点
bool hasFocus() const; // 是否拥有焦点
void clearFocus(); // 释放焦点
布局管理
布局管理也是通过一些类实现的,经过预编译后,被转换为C++代码
QStackedLayout(堆叠布局)在Designer里没有体现,它提供了一个组件堆叠,基中一次只有一个可见
容器组件
可以将一组需要布局管理的组件放在一个容器组件中,这样,当容器大小变化时,里面的组件也会自动变化
水平布局
- layoutStretch:0,0,0,表示3个组件平均分配宽度
- layoutStretch:0,0,2,前两个组件达到合适宽度后不再增加宽度,其余的空间分配给第三个组件
- layoutStretch:1,1,2,表示前两个组件达到合适宽度后将尽量满足1:1:2的比例
网格布局
在Layout中单独设置Stretch值的意义不大
QGridLayout类添加组件的函数是addWidget()
分割条
分割条允许用户通过拖动widget之间的边界来控制widget的大小,任意数量的部件都可以由单个分割条控制。QSplitter的典型用法就是创建几个小widget,并使用insertWidget()或addWidget()添加它们
QSplitter* splitter = new QSplitter(this);
QListView* listView = new QListView;
QTreeView* treeView = new QTreeView;
QTextEdit* textEdit = new QTextEdit;splitter->addWidget(listView );
splitter->addWidget(treeView );
splitter->addWidget(textEdit );
效果展示