显示组件的两种方式
在窗口上显示一个组件有两种方法:方法 1------构建时不指定父对象,直接调用该对象的 show();方法 2------构建时指定父对象,父对象调用 show() 后,其中的子组件自动跟着显示。
-
指定父对象有两个作用:①父组件显示时,子组件也跟着显示;②父对象被销毁时,所有子组件被父对象自动销毁。
-
在堆上(new)构建子组件时,如果没指定父对象或没加进布局,必须手动 delete 释放------否则内存泄漏。
-
有父对象的组件不能手动 delete
// 方法1:无父对象,自己 show()
QLabel *lbl = new QLabel("hallo");
lbl->show(); // 不 show 就不显示,且要手动 delete
// 方法2:指定父对象,父 show 即可
QLabel *lbl2 = new QLabel("hallo", &w); // 父对象是窗口 w
w.show(); // w 显示,lbl2 自动跟着显示
// w 销毁时 lbl2 自动销毁,无需手动 delete
标签 QLabel
QLabel 的常用方法
QLabel(标签)是最常用的控件之一,可显示文本(普通文本、HTML)、图片和动画。继承关系:QLabel → QFrame → QWidget。
| 方法 | 作用 | 代码示例 |
|---|---|---|
setText(QString) |
设置文本内容 | lbl->setText("嘎嘎嘎") |
text() |
获取标签内容 | qDebug()<<lbl->text() |
clear() |
清空内容 | lbl->clear() |
move(x, y) |
设置位置(相对父窗体左上角) | lbl->move(200,200) |
resize(w, h) |
设置大小 | lbl->resize(500,20) |
setGeometry(x,y,w,h) |
位置+大小一步设置 | lbl->setGeometry(200,200,240,240) |
setFont(QFont) |
设置字体属性 | 见下 |
setStyleSheet("color: rgb(...)") |
设置文字颜色 | lbl->setStyleSheet("color: rgb(255, 0, 0)") |
setScaledContents(true) |
图片自适应填满 | lbl->setScaledContents(true) |
setPixmap(QPixmap) |
显示图片 | lbl->setPixmap(img) |
setFrameShape(QFrame::Box) |
显示边框 | lbl->setFrameShape(QFrame::Box) |
setAlignment(Qt::AlignRight) |
文本对齐方式 | lbl->setAlignment(Qt::AlignRight) |
setToolTip(QString) |
鼠标悬停提示 | btn->setToolTip("嘎嘎嘎") |
QFont ft; // 字体对象
ft.setFamily("微软雅黑"); // 字体族(字体名)
ft.setPixelSize(24); // 字号(像素)
ft.setBold(true); // 加粗
ft.setItalic(true); // 斜体
ft.setUnderline(true); // 下划线
lbl->setFont(ft); // 应用字体
// 图片显示完整流程
lbl->setScaledContents(true); // 自适应:图片填满标签框
QPixmap img; // 图片对象
img.load("d:\\1.png"); // 从文件加载图片
lbl->setPixmap(img); // 设置给标签
QPushButton
按钮的常用方法与信号
QPushButton(按钮)用于接收用户操作、激发相应事件,是用户与程序交互最简便的方式。常用信号:clicked(bool checked = false)(点击时发射)。
快捷键:btn->setShortcut(QKeySequence("Ctrl+s")),按 Ctrl+S 等同点击按钮。
setFlat(true):去掉按钮边框,让按钮和背景融为一体。
setVisible(false) 隐藏、setEnabled(false) 禁用(禁用后点击无效且变灰)。
| 方法 | 作用 | 老师代码示例 |
|---|---|---|
setText() |
设置按钮文字 | btn->setText("取消") |
text() |
获取按钮文字 | qDebug()<<btn->text() |
resize(w,h) / move(x,y) |
大小 / 位置 | btn->resize(100,50) |
setFont(QFont) |
字体 | btn->setFont(ft) |
setStyleSheet(...) |
文字颜色/背景色 | btn->setStyleSheet("background-color: rgb(85,255,0)") |
setIcon(QIcon) / setIconSize(QSize) |
图标及大小 | btn->setIcon(image) |
setFlat(true) |
扁平无边框 | btn->setFlat(true) |
setVisible(false) |
隐藏 | btn->setVisible(false) |
setEnabled(false) |
禁用 | btn->setEnabled(false) |
setToolTip() |
悬停提示 | btn->setToolTip("嘎嘎嘎") |
setShortcut(QKeySequence) |
快捷键 | btn->setShortcut(QKeySequence("Ctrl+s")) |
setParent(&w) |
事后指定父对象 | btn->setParent(&w) |
QPushButton *btn = new QPushButton("确定", &w); // 创建按钮并指定父对象
btn->setText("取消"); // 改文字
btn->resize(100, 50); // 大小
btn->move(100, 100); // 位置
// 新式 connect:第四参数是 lambda(匿名函数),点击时打印
QObject::connect(btn, &QPushButton::clicked, &w,
[](){ qDebug() << "阳阳"; });
单选按钮 QRadioButton
单选按钮的互斥机制
QRadioButton(单选按钮),当多个单选按钮存在时只能选中一个(自动互斥)。常用方法:isChecked()(是否选中)、setChecked(bool)(设置选中)。常用信号:toggled(bool checked)(状态变化时发射,携带当前状态)。
同一个父容器下的单选按钮自动互斥:给多个按钮 setChecked(true),最终只有一个保持选中(后设置的会挤掉前面的)。
想要多组互斥(比如性别一组、学历一组互不影响),用 QGroupBox(分组框)或 QButtonGroup 隔离。
toggled 信号参数 bool checked 直接告诉当前状态;也可在槽里用 isChecked() 再查。
QRadioButton *opt1 = new QRadioButton("男", &w);
QRadioButton *opt2 = new QRadioButton("女", &w);
opt1->move(100, 100);
opt2->move(100, 120);
opt1->setChecked(true); // 设 opt1 选中
opt2->setChecked(true); // 再设 opt2 选中 → 自动互斥,opt1 被取消
// 状态变化时触发:信号参数 check 就是当前状态
QObject::connect(opt1, &QRadioButton::toggled, &w, test);
// 槽里再确认
if (opt1->isChecked()) // 检测当前是否选中
qDebug() << "男被选中";
复选框 QCheckBox
复选框的常用方法与信号
QCheckBox(复选框),可独立选中/取消(不互斥,多个可同时选中)。常用方法:text()、setText()、isChecked()、setChecked(bool)。常用信号:toggled(bool checked)(状态变化时发射,携带当前状态)。
isChecked() 在任何时候都可查询当前状态。
toggled(bool) 与 clicked(bool) 的区别:toggled 只要状态变化就发射(包括代码 setChecked 触发),clicked 只在用户点击时发射。
QCheckBox *check1 = new QCheckBox("游戏", &w);
QCheckBox *check2 = new QCheckBox("打球", &w);
check1->move(100, 100);
check2->move(100, 120);
check1->setText("娱乐"); // 修改文字
w.connect(check1, &QCheckBox::toggled, &w, test); // 状态变化触发
qDebug() << check1->isChecked(); // 查询当前状态
输入组件
QLineEdit 单行编辑框
setEchoMode() 设置显示模式:QLineEdit::Password 密码模式(显示圆点)。
setReadOnly(true) 只读、setMaxLength(n) 限制最大字符数、setPlaceholderText() 灰色提示文字(框内没输入时显示)。
三个信号要分清:textChanged(QString)------任何文本改变(含 setText() 触发);textEdited(QString)------只有用户编辑造成改变时发(setText() 不触发);editingFinished()------编辑结束(回车或失去焦点)时发。
QLineEdit *le = new QLineEdit(&w);
le->setText("初始内容"); // 设置文本
QString s = le->text(); // 获取文本
le->setEchoMode(QLineEdit::Password); // 密码模式
le->setReadOnly(true); // 只读
le->setMaxLength(20); // 最多 20 字符
le->setPlaceholderText("请输入账号"); // 提示文字
connect(le, &QLineEdit::textChanged, &w, [](QString t){
qDebug() << "内容变了:" << t; // 实时响应输入
});
QTextEdit 多行文本编辑框
QTextEdit(文本编辑框)是多行文本编辑器,可显示和编辑多行简单文本,支持 HTML 子集(表格、文字、图形)。
insertPlainText() 插入纯文本块、insertHtml() 插入 HTML 格式文本、toPlainText() 获取控件中输入的内容、setReadOnly() 设只读。
QComboBox 下拉框
QComboBox(组合框)是下拉菜单控件,用户可手动输入数据,也可从列表选一个条目。
addItem() 添加一项(可 addItems(QStringList) 一次加多个)、clear() 清空、count() 项数、currentIndex() 当前索引(从 0 开始)、currentText() 当前选中的内容、itemText(index) 取某索引内容、setCurrentIndex(index) 设置当前项、setEditable(true) 可编辑、setEditText() 设置编辑框内容。
常用信号:currentTextChanged(QString)(当前选择变化时发射)。
QComboBox *cb = new QComboBox(&w);
cb->addItem("苹果"); // 添加一项
cb->addItem("香蕉");
cb->addItems({"橘子", "葡萄"}); // 一次加多个
int idx = cb->currentIndex(); // 当前索引(从0开始)
QString t = cb->currentText(); // 当前选中内容
QString t2 = cb->itemText(2); // 索引2的内容
connect(cb, &QComboBox::currentTextChanged, &w, [](QString s){
qDebug() << "选择了:" << s; // 选择变化实时响应
});
QDateTimeEdit 日期时间组件
QDateTimeEdit 用于编辑日期和时间,可用键盘或箭头键增减。setCalendarPopup(true) 可弹出日历选择日期。
dateTime() 获取日期时间、setDateTime() 设置日期时间。
QDateTime::currentDateTime() 获取本地系统当前时间,配合 date()/time() 取部分、toString() 格式化显示