四、基本组件
1. Designer设计师(掌握)
Qt Designer 是 Qt 提供的可视化界面设计工具,支持通过拖拽组件快速构建 GUI 界面,生成的界面文件以 .ui
格式保存(基于 XML 的标签语言)。
-
核心功能:
-
在 Qt Creator 中创建项目时勾选“界面文件”选项,自动生成与窗口类关联的
.ui
文件。 -
所有 Designer 操作均可通过 C++ 代码实现(如布局管理、信号槽连接)。
-
-
代码集成:通过
ui->setupUi(this)
将界面与逻辑绑定,组件通过ui->组件名
访问。
2. 布局管理(Layout)(掌握)
布局通过“透明盒子”模式管理组件排列,支持自适应窗口缩放。
常见布局类型
类型 | 特点 |
---|---|
垂直布局 | 组件竖向排列( |
水平布局 | 组件横向排列( |
网格布局 | 组件按 n×m 表格排列( |
表单布局 | 专为输入表单设计( |
布局操作技巧
-
贴合窗口:选中窗口对象后点击布局按钮,使布局自动适配窗口边缘。
-
填充空白:添加“伸展组件(Stretch)”填充剩余空间。
-
嵌套布局:外层布局可将内层布局视为子组件,实现复杂界面。
3. QWidget类(掌握)
所有界面组件的基类,代表一个矩形窗口区域,支持嵌套和事件处理。
-
关键属性(Designer 中可见):
-
大小策略(Size Policy):控制组件在布局中的伸缩行为(默认策略适配多数场景)。
-
4. 界面文件与C++代码的关系(熟悉)
-
.ui
文件:通过 Qt Designer 设计的界面描述文件,编译后生成对应的 C++ 头文件(如ui_mainwindow.h
)。 -
代码绑定:在窗口类构造函数中调用
ui->setupUi(this)
初始化界面。
5. QLabel标签(掌握)
5.1 基本属性
-
功能:显示静态文本或图片,不支持用户交互(无信号函数)。
-
命名规范:默认命名格式为“标签名称_序号”(如
labelPic
),双击可修改文本。
5.2 资源库管理
-
图片格式:支持 JPG(无透明)、PNG(含透明)、GIF(动态图)。
-
导入步骤:
-
将图片文件(无中文名)放入项目目录。
-
右键项目 → “添加新文件” → 选择 Qt 资源文件(
.qrc
)。 -
在资源文件中添加图片路径,生成虚拟路径(如
:/new/prefix1/logo.png
)。
-
5.3 代码操作示例
// 加载并缩放图片
QPixmap pic(":/new/prefix1/logo.png");
QSize size(ui->label->width(), ui->label->height());
pic = pic.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(pic);
5.4 动态图播放(QMovie)
// 播动图
QMovie *movie = new QMovie(":/new/prefix1/kunkun.gif", this);
ui->labelPic->setMovie(movie);
movie->start();
6. QAbstractButton按钮类(掌握)
按钮基类,包含通用属性和信号槽机制。
6.1 按钮样式设置
-
图标添加:通过 Qt 资源管理器导入图标(如
https://www.iconfont.cn/
),设置icon
属性。 -
去边框:通过样式表
border: none; background-color: transparent;
实现透明效果。
6.2 信号与槽
-
单选按钮(QRadioButton):
connect(ui->radioButton_3, SIGNAL(toggled(bool)), this, SLOT(toggledSlot(bool)));
-
按钮分组(QButtonGroup):
QButtonGroup *btp = new QButtonGroup(this); btp->addButton(ui->checkBox, 1); // 按钮ID为1 connect(btp, SIGNAL(buttonToggled(int,bool)), this, SLOT(buttonToggledSlot(int,bool)));
7. QLineEdit单行文本输入框(掌握)
7.1 常用信号
-
returnPressed()
:回车键触发。 -
selectionChanged()
:选中文本变化时触发。
7.2 代码示例
// 获取输入内容
connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(returnPressedSlot())); void Dialog::returnPressedSlot() { qDebug() << "输入内容:" << ui->lineEdit->text();
}