目录
[QWidget 核心属性之 enabled(可用状态)](#QWidget 核心属性之 enabled(可用状态))
[QWidget 的 enabled 属性解析](#QWidget 的 enabled 属性解析)
[button_enable 控制 button_1 可用 / 禁用的代码实现](#button_enable 控制 button_1 可用 / 禁用的代码实现)
总结
[QWidget 核心属性之 geometry(坐标系)](#QWidget 核心属性之 geometry(坐标系))[QWidget 的 geometry 属性解析](#QWidget 的 geometry 属性解析)
[setGeometry 的两种传参方式](#setGeometry 的两种传参方式)
[QRect 对象解析](#QRect 对象解析)
[代码中 target 按钮平移的实现逻辑](#代码中 target 按钮平移的实现逻辑)
总结
[QWidget 核心属性之 frameGeometry(窗口框架坐标系)](#QWidget 核心属性之 frameGeometry(窗口框架坐标系))[Window frame(窗口框架)定义](#Window frame(窗口框架)定义)
[widget.cpp 代码解析](#widget.cpp 代码解析)
[frameGeometry () 与 geometry () 的核心区别](#frameGeometry () 与 geometry () 的核心区别)
[QWidget 核心属性之 Qlcon(设置图标)](#QWidget 核心属性之 Qlcon(设置图标))[widget.cpp 代码解析](#widget.cpp 代码解析)
[QIcon 对象解析](#QIcon 对象解析)
[qrc 资源机制解析](#qrc 资源机制解析)
[QWidget 核心属性之 qrc](#QWidget 核心属性之 qrc)
[QWidget 核心属性之 WindowOpacity(透明度)](#QWidget 核心属性之 WindowOpacity(透明度))[windowOpacity () 函数解析](#windowOpacity () 函数解析)
[setWindowOpacity () 函数解析](#setWindowOpacity () 函数解析)
总结
[QWidget 核心属性之 cursor(光标形状)](#QWidget 核心属性之 cursor(光标形状))[QCursor 对象解析](#QCursor 对象解析)
[setCursor 函数解析](#setCursor 函数解析)
总结
[qrc + cursor(自定义光标形状)](#qrc + cursor(自定义光标形状))[QPixmap 对象解析](#QPixmap 对象解析)
[pixmap.scaled (100, 100) 函数解析](#pixmap.scaled (100, 100) 函数解析)
[cursor (pixmap, 50, 50) 构造函数解析](#cursor (pixmap, 50, 50) 构造函数解析)
总结
[QWidget 核心属性之 font(字体设置)](#QWidget 核心属性之 font(字体设置))[QLabel 对象解析](#QLabel 对象解析)
[QFont 对象解析](#QFont 对象解析)
总结
[QWidget 核心属性之 toolTip(按键说明)](#QWidget 核心属性之 toolTip(按键说明))[setToolTip 函数解析](#setToolTip 函数解析)
[setToolTipDuration 函数解析](#setToolTipDuration 函数解析)
总结
[QWidget 核心属性之 focusPolicy(设置焦点)](#QWidget 核心属性之 focusPolicy(设置焦点))[QLineEdit 对象解析](#QLineEdit 对象解析)
[setFocusPolicy 函数解析](#setFocusPolicy 函数解析)
第一个输入框的默认焦点策略(Qt::StrongFocus)
总结
[QWidget 核心属性之 styleSheet(设置界面样式)](#QWidget 核心属性之 styleSheet(设置界面样式))[setStyleSheet 函数解析](#setStyleSheet 函数解析)
[setStyleSheet 函数参数解析](#setStyleSheet 函数参数解析)
[rgb 颜色表示法解析](#rgb 颜色表示法解析)
QWidget 核心属性之 enabled(可用状态)
widget.h
#ifndef WIDGET_H // 头文件保护宏:防止重复包含,保证头文件只被编译一次
#define WIDGET_H
// 包含Qt核心头文件:QWidget(窗口基类)、QPushButton(按钮控件)、QDebug(调试输出)
#include <QWidget>
#include <QPushButton>
#include <QDebug>
// Qt命名空间声明:简化Ui::Widget的使用
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
// 自定义Widget类:继承QWidget(Qt窗口基类),需添加Q_OBJECT宏支持信号槽机制
class Widget : public QWidget
{
Q_OBJECT // 必须添加的宏:启用Qt的元对象系统,支持信号槽、动态属性等特性
public:
// 构造函数:创建Widget对象,parent为父窗口(默认nullptr表示无父窗口)
Widget(QWidget *parent = nullptr);
// 析构函数:释放动态分配的资源(如Ui对象)
~Widget();
// 槽函数声明:按钮1被点击时执行的逻辑
void button_1_clicked();
// 槽函数声明:切换按钮1可用/禁用状态的逻辑
void button_enable_clicked();
private:
Ui::Widget *ui; // UI对象:由Qt Designer生成,管理界面控件(本例未使用Designer布局,仅保留默认)
QPushButton* button_1; // 按钮1对象指针:被控制状态的目标按钮
QPushButton* button_enable; // 控制按钮指针:用于切换button_1的可用/禁用状态
};
#endif // WIDGET_H // 头文件保护宏结束
widget.cpp
#include "widget.h" // 包含自定义Widget类的头文件
#include "ui_widget.h" // 包含Qt Designer生成的UI头文件(本例未使用Designer布局)
// 构造函数:初始化Widget窗口,创建按钮并设置信号槽连接
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类QWidget的构造函数
, ui(new Ui::Widget) // 初始化UI对象(动态分配内存)
{
ui->setupUi(this); // 初始化UI界面(本例未使用Designer,仅为默认调用)
// 1. 创建按钮对象:指定父对象为this(Widget窗口),由Qt父对象机制自动管理内存
button_1 = new QPushButton(this); // 创建目标按钮button_1
button_enable = new QPushButton(this); // 创建控制按钮button_enable
// 2. 设置按钮文本和位置
button_1->setText("按钮1"); // 设置button_1的显示文本
button_1->move(100, 100); // 设置button_1在窗口中的坐标(x=100, y=100)
button_enable->setText("切换按钮1的运行状态"); // 设置控制按钮的显示文本
button_enable->move(100, 300); // 设置控制按钮的坐标(x=100, y=300)
// 3. 信号槽连接:Qt核心机制,实现按钮点击事件与槽函数的绑定
// 绑定:button_1被点击 → 执行Widget的button_1_clicked槽函数
connect(button_1, &QPushButton::clicked, this, &Widget::button_1_clicked);
// 绑定:button_enable被点击 → 执行Widget的button_enable_clicked槽函数
connect(button_enable, &QPushButton::clicked, this, &Widget::button_enable_clicked);
}
// 析构函数:释放动态分配的UI对象内存
Widget::~Widget()
{
delete ui; // 释放Ui::Widget对象,避免内存泄漏
}
// 槽函数实现:button_1被点击时执行的逻辑
void Widget::button_1_clicked()
{
qDebug() << "按钮1执行了槽函数"; // 调试输出:确认按钮1的点击事件被触发
}
// 核心槽函数:切换button_1的可用/禁用状态
void Widget::button_enable_clicked()
{
// 第一步:获取button_1当前的可用状态
// isEnabled()返回bool值:true=可用(可点击),false=禁用(灰显,不可点击)
bool enable = button_1->isEnabled();
// 第二步:根据当前状态切换button_1的可用状态
if(enable == true) // 如果当前可用 → 设置为禁用
{
button_1->setEnabled(false); // setEnabled(false):禁用按钮,灰显且无法触发点击事件
}
else // 如果当前禁用 → 设置为可用
{
button_1->setEnabled(true); // setEnabled(true):启用按钮,恢复可点击状态
}
}
QWidget 的 enabled 属性解析
// enabled属性的核心操作函数
bool QWidget::isEnabled() const; // 获取当前enabled状态
void QWidget::setEnabled(bool enable); // 设置enabled状态
enabled 属性的核心定义 :enabled 是 QWidget 的核心布尔属性,用于标识控件是否处于 "可用状态",默认值为true(可用)。
禁用状态(enabled=false)的具体表现:
- 输入事件拦截:禁用的控件无法接收任何用户输入事件(鼠标点击、键盘输入、鼠标悬停等)。例如禁用后的 button_1,即使绑定了 clicked 信号与槽函数,点击也不会触发信号,槽函数不会执行。
- 外观变化:禁用的控件会自动呈现灰显样式(视觉上的灰色效果),与可用状态形成明显区分,直观提示用户该控件不可操作。
- 子元素继承禁用状态 :若父 Widget 被设置为禁用(
setEnabled(false)),其所有子控件会自动继承禁用状态(无论子控件自身的 enabled 属性如何);仅当父控件启用时,子控件的 enabled 状态由自身决定。
button_enable 控制 button_1 可用 / 禁用的代码实现
核心逻辑:通过 button_enable 的点击事件触发槽函数,获取 button_1 当前的 enabled 状态,根据状态反向设置 button_1 的 enabled 属性,实现 "可用↔禁用" 的切换。
步骤 1:触发入口 ------ 信号槽绑定(构造函数中)
connect(button_enable, &QPushButton::clicked, this, &Widget::button_enable_clicked);
将 button_enable 的clicked信号与button_enable_clicked槽函数绑定,点击 button_enable 时自动执行该槽函数,这是控制逻辑的触发条件。
步骤 2:获取当前状态 ------isEnabled () 函数
bool enable = button_1->isEnabled();
调用 QWidget 的isEnabled()成员函数,返回 button_1 当前的 enabled 状态(true= 可用,false= 禁用),并将结果存入enable变量,作为后续判断的依据。
步骤 3:切换状态 ------setEnabled () 函数
if(enable == true) // 当前可用 → 切换为禁用
{
button_1->setEnabled(false); // 禁用button_1:灰显+无法触发点击事件
}
else // 当前禁用 → 切换为可用
{
button_1->setEnabled(true); // 启用button_1:恢复正常外观+可触发点击事件
}
setEnabled(false):将 button_1 设置为禁用状态,此时 button_1 灰显,点击不会触发clicked信号,button_1_clicked槽函数不会执行。setEnabled(true):将 button_1 恢复为可用状态,外观恢复正常,点击可触发clicked信号并执行对应槽函数。
完整槽函数逻辑
void Widget::button_enable_clicked()
{
bool enable = button_1->isEnabled(); // 1. 获取当前状态
if(enable == true) // 2. 判断状态并切换
{
button_1->setEnabled(false);
}
else
{
button_1->setEnabled(true);
}
}
总结
- QWidget 的 enabled 属性决定控件是否可用,禁用状态下控件灰显、无法接收输入事件,且父控件禁用会导致所有子控件继承禁用状态。
- 代码中通过 button_enable 的点击事件触发槽函数,利用
isEnabled()获取 button_1 当前状态,通过setEnabled()反向设置状态,实现可用 / 禁用的切换。 - 禁用后的 button_1 无法触发
clicked信号,因此不会执行button_1_clicked槽函数,直到被重新启用。
QWidget 核心属性之 geometry(坐标系)
widget.h
#ifndef WIDGET_H // 头文件保护宏:防止重复包含,保证头文件仅编译一次
#define WIDGET_H
#include <QWidget> // Qt窗口基类:所有自定义窗口都继承此类
#include <QPushButton>// Qt按钮控件类:用于创建可点击的按钮
// Qt命名空间声明:简化Ui::Widget的使用(本例UI文件未实际自定义控件,仅保留默认)
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
// 自定义Widget类:继承QWidget,需添加Q_OBJECT宏支持信号槽机制
class Widget : public QWidget
{
Q_OBJECT // 必须添加的宏:启用Qt元对象系统,支持信号槽、动态属性等特性
public:
// 构造函数:创建Widget窗口对象,parent为父窗口(默认无父窗口)
Widget(QWidget *parent = nullptr);
// 析构函数:释放动态分配的UI资源
~Widget();
// 槽函数声明:对应四个方向按钮的点击事件,控制target按钮平移
void button_up_clicked(); // 向上平移target按钮
void button_down_clicked(); // 向下平移target按钮
void button_right_clicked(); // 向右平移target按钮
void button_left_clicked(); // 向左平移target按钮
private:
Ui::Widget *ui; // UI对象:Qt Designer生成的界面管理对象(本例未使用Designer布局)
QPushButton* button_target; // 目标按钮指针:被控制平移的按钮
};
#endif // WIDGET_H // 头文件保护宏结束
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建目标按钮:被控制移动的核心按钮
button_target = new QPushButton(this);
button_target->setText("target");
// setGeometry 用法1:直接传入 (x, y, width, height)
// 一次性设置按钮的初始位置和大小
button_target->setGeometry(300, 150, 150, 70);
// 创建四个方向控制按钮
QPushButton* button_up = new QPushButton(this);
QPushButton* button_down = new QPushButton(this);
QPushButton* button_left = new QPushButton(this);
QPushButton* button_right = new QPushButton(this);
button_up->setText("up");
button_down->setText("down");
button_left->setText("left");
button_right->setText("right");
// 布局方向按钮:形成十字键布局
button_up->setGeometry(300, 350, 70, 70); // 上按钮
button_down->setGeometry(300, 350+70*2, 70, 70); // 下按钮(y轴偏移140)
button_left->setGeometry(300-70, 350+70, 70, 70); // 左按钮(x轴偏移-70,y轴偏移70)
button_right->setGeometry(300+70, 350+70, 70, 70);// 右按钮(x轴偏移+70,y轴偏移70)
// 信号槽绑定:方向按钮点击 → 执行对应平移逻辑
connect(button_up, &QPushButton::clicked, this, &Widget::button_up_clicked);
connect(button_down, &QPushButton::clicked, this, &Widget::button_down_clicked);
connect(button_left, &QPushButton::clicked, this, &Widget::button_left_clicked);
connect(button_right, &QPushButton::clicked, this, &Widget::button_right_clicked);
}
Widget::~Widget()
{
delete ui;
}
// 向上平移:保持按钮高度不变,整体向上移动
void Widget::button_up_clicked()
{
// 获取target按钮当前的位置和大小(QRect 包含 x/y/width/height)
QRect rect = button_target->geometry();
// 核心逻辑:同步调整顶部位置和高度,保持按钮形状不变
rect.setY(rect.y() - 5); // 按钮顶部向上移动5像素
rect.setHeight(rect.height() - 5);// 高度同步减少5像素 → 按钮底部位置同步上移,自身高度不变
// setGeometry 用法2:传入修改后的 QRect 对象
// 将修改后的位置和大小同步回按钮(QRect 是值拷贝,必须主动调用 setGeometry 生效)
button_target->setGeometry(rect);
}
// 向下平移:保持按钮高度不变,整体向下移动
void Widget::button_down_clicked()
{
QRect rect = button_target->geometry();
rect.setY(rect.y() + 5); // 按钮顶部向下移动5像素
rect.setHeight(rect.height() + 5);// 高度同步增加5像素 → 按钮底部位置同步下移,自身高度不变
button_target->setGeometry(rect);
}
// 向右平移:保持按钮宽度不变,整体向右移动
void Widget::button_right_clicked()
{
QRect rect = button_target->geometry();
rect.setX(rect.x() + 5); // 按钮左边界向右移动5像素
rect.setWidth(rect.width() + 5); // 宽度同步增加5像素 → 按钮右边界位置同步右移,自身宽度不变
button_target->setGeometry(rect);
}
// 向左平移:保持按钮宽度不变,整体向左移动
void Widget::button_left_clicked()
{
QRect rect = button_target->geometry();
rect.setX(rect.x() - 5); // 按钮左边界向左移动5像素
rect.setWidth(rect.width() - 5); // 宽度同步减少5像素 → 按钮右边界位置同步左移,自身宽度不变
button_target->setGeometry(rect);
}
QWidget 的 geometry 属性解析
// 获取控件几何属性(位置+大小)
QRect QWidget::geometry() const;
// 设置控件几何属性(位置+大小)
void QWidget::setGeometry(int x, int y, int width, int height);
void QWidget::setGeometry(const QRect &rect);
geometry 是 QWidget 的核心属性,用于描述控件在父窗口坐标系中的位置 和大小,核心组成:
- x 轴:控件左边界相对于父窗口左上角的水平像素偏移(向右为正方向)。
- y 轴:控件上边界相对于父窗口左上角的垂直像素偏移(向下为正方向)。
- width(宽度):控件从左边界到右边界的水平像素长度。
- height(高度):控件从上边界到下边界的垂直像素长度。
geometry()用于读取 当前几何属性,setGeometry()用于修改几何属性。
setGeometry 的两种传参方式
方式 1:直接传入四个整型参数(x, y, width, height)
// 代码示例:初始化target按钮的位置和大小
button_target->setGeometry(300, 150, 150, 70);
// 代码示例:初始化up按钮的位置和大小
button_up->setGeometry(300, 350, 70, 70);
- 参数顺序:
x(左边界坐标)→y(上边界坐标)→width(宽度)→height(高度)。 - 适用场景:控件初始化时,需要一次性直接设定位置和大小,代码简洁直观,无需额外封装。
方式 2:传入 QRect 对象
// 代码示例:修改target按钮位置后重新设置
QRect rect = button_target->geometry();
rect.setY(rect.y() - 5);
rect.setHeight(rect.height() - 5);
button_target->setGeometry(rect);
- 参数类型:单个
QRect对象,该对象已封装 x、y、width、height 四个几何属性。 - 适用场景:需要先获取控件当前几何属性,修改部分属性后再重新设置(如平移、缩放),无需手动记录四个独立参数,逻辑更清晰。
QRect 对象解析
// QRect核心操作函数(获取/设置几何属性)
int QRect::x() const; // 获取x坐标
void QRect::setX(int x); // 设置x坐标
int QRect::y() const; // 获取y坐标
void QRect::setY(int y); // 设置y坐标
int QRect::width() const; // 获取宽度
void QRect::setWidth(int w); // 设置宽度
int QRect::height() const; // 获取高度
void QRect::setHeight(int h);// 设置高度
QRect 是 Qt 封装的矩形几何对象,核心特性:
- 封装性:将 x、y(位置)和 width、height(大小)四个独立的几何参数整合为一个对象,简化参数传递和修改逻辑。
- 值类型特性 :
QRect rect = button_target->geometry()会创建几何属性的副本 ,修改副本的属性不会直接影响控件,必须调用setGeometry(rect)才能将修改同步到控件。
几何参数的单位:像素点
代码中所有几何参数(x、y、width、height)的单位均为像素点:
// 示例:所有数值均为像素单位
button_target->setGeometry(300, 150, 150, 70); // x=300像素,y=150像素,宽150像素,高70像素
rect.setY(rect.y() - 5); // y轴偏移减少5像素(向上移动5像素)
rect.setX(rect.x() + 5); // x轴偏移增加5像素(向右移动5像素)
- 像素点是屏幕显示的最小单位,一个像素对应屏幕上一个可控制颜色的物理点。
- Qt 中所有控件的几何属性均以像素为单位,保证不同显示设备上的位置 / 大小计算逻辑一致(忽略系统 DPI 缩放的场景)。
代码中 target 按钮平移的实现逻辑
平移的核心目标:保持按钮自身大小不变,仅修改其在父窗口中的位置,通过调整 QRect 的位置属性 + 反向调整大小属性实现纯平移:
向上平移(button_up_clicked)
QRect rect = button_target->geometry();
rect.setY(rect.y() - 5); // 按钮上边界向上移动5像素
rect.setHeight(rect.height() - 5);// 高度减少5像素 → 下边界同步上移5像素,按钮高度不变
button_target->setGeometry(rect);
- 仅修改 y 坐标会导致按钮上移但下边界位置不变(按钮 "变矮");同步减少 height,让下边界也上移 5 像素,最终保持按钮高度不变,实现纯向上平移。
向下平移(button_down_clicked)
rect.setY(rect.y() + 5); // 按钮上边界向下移动5像素
rect.setHeight(rect.height() + 5);// 高度增加5像素 → 下边界同步下移5像素,按钮高度不变
- 增加 y 坐标的同时增加 height,保证按钮高度不变,仅整体向下平移 5 像素。
向右平移(button_right_clicked)
rect.setX(rect.x() + 5); // 按钮左边界向右移动5像素
rect.setWidth(rect.width() + 5); // 宽度增加5像素 → 右边界同步右移5像素,按钮宽度不变
- 增加 x 坐标的同时增加 width,保证按钮宽度不变,仅整体向右平移 5 像素。
向左平移(button_left_clicked)
rect.setX(rect.x() - 5); // 按钮左边界向左移动5像素
rect.setWidth(rect.width() - 5); // 宽度减少5像素 → 右边界同步左移5像素,按钮宽度不变
- 减少 x 坐标的同时减少 width,保证按钮宽度不变,仅整体向左平移 5 像素。
总结
- geometry 属性管理控件的位置(x/y)和大小(width/height),setGeometry 支持 "四整型参数" 和 "QRect 对象" 两种传参方式,分别适配初始化和动态修改场景。
- QRect 是封装几何属性的值类型对象,修改其属性后需调用 setGeometry 才能同步到控件。
- 按钮平移的核心逻辑是调整位置属性的同时反向调整大小属性,保持控件自身尺寸不变,所有几何参数的单位均为像素点。
QWidget 核心属性之 frameGeometry(窗口框架坐标系)
widget.cpp
#include "widget.h" // 自定义Widget类的头文件
#include "ui_widget.h" // Qt Designer生成的UI头文件
#include <QDebug> // Qt调试输出(qDebug)
#include <QPushButton> // Qt按钮控件类
// 构造函数:初始化Widget窗口,创建按钮并绑定信号槽
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类QWidget的构造函数
, ui(new Ui::Widget) // 动态创建UI对象(Qt父对象机制管理内存)
{
ui->setupUi(this); // 初始化UI界面(本例未自定义UI,仅为默认调用)
// 创建一个QPushButton按钮,指定父对象为当前Widget窗口
// 父对象为this时,Qt自动管理按钮的内存,无需手动delete
QPushButton* button = new QPushButton(this);
button->setText("按钮"); // 设置按钮显示文本
button->move(100, 100); // 设置按钮在窗口客户区的位置(x=100, y=100)
// 信号槽绑定:按钮被按下(pressed信号)→ 执行handle槽函数
// pressed信号:按钮按下时触发(区别于clicked:按下+松开才触发)
connect(button, &QPushButton::pressed, this, &Widget::handle);
}
// 析构函数:释放UI对象内存
Widget::~Widget()
{
delete ui;
}
// 槽函数:按钮按下时执行,打印窗口的两个几何信息(核心对比)
void Widget::handle()
{
// ========== geometry():窗口客户区的几何信息 ==========
// 返回值:QRect(x, y, width, height)
// 1. x/y:客户区左上角相对于父窗口(无父则为屏幕)的坐标;
// 2. width/height:客户区的宽高(仅包含窗口内可绘制区域,不含标题栏、边框);
// 3. 客户区:窗口中能放置控件、绘制内容的区域(比如按钮、文本框所在的区域)。
qDebug() << "窗口客户区几何信息(geometry):" << this->geometry();
// ========== frameGeometry():窗口整个窗体的几何信息 ==========
// 返回值:QRect(x, y, width, height)
// 1. x/y:整个窗体(含边框/标题栏)左上角相对于屏幕的坐标;
// 2. width/height:整个窗体的总宽高(包含标题栏、窗口边框、客户区);
// 3. 对于有标题栏的顶层窗口(如QWidget默认的窗口),frameGeometry的宽高会比geometry大。
qDebug() << "窗口整体几何信息(frameGeometry):" << this->frameGeometry();
}

Window frame(窗口框架)定义
Window frame(窗口框架)由操作系统自动绘制与管理,是顶层窗口的外部装饰区域,核心组成包括标题栏 (窗口标题、最小化 / 最大化 / 关闭按钮)、窗口边框 (四周可拖拽调整大小的区域)。该区域不属于 Qt 应用的客户区,操作系统负责窗口框架的样式与绘制,不同操作系统的窗口框架存在样式差异。
widget.cpp 代码解析
构造函数实现
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 动态创建按钮,父对象为当前Widget窗口,由Qt自动管理内存
QPushButton* button = new QPushButton(this);
button->setText("按钮"); // 设置按钮显示文本
button->move(100, 100); // 设置按钮在窗口客户区的位置(x=100, y=100)
// 绑定按钮pressed信号到handle槽函数:按钮按下瞬间触发
connect(button, &QPushButton::pressed, this, &Widget::handle);
}
构造函数完成窗口初始化、按钮创建与信号槽绑定:
ui->setupUi(this):初始化 Qt Designer 生成的 UI 界面,本例未自定义 UI 控件,仅保留默认调用。QPushButton* button = new QPushButton(this):动态创建按钮,父对象为当前 Widget 窗口,Qt父对象树机制 自动管理按钮内存,无需手动delete。button->setText("按钮"):设置按钮的显示文本。button->move(100, 100):设置按钮在窗口客户区的位置,坐标基于客户区左上角(x=100,y=100)。connect(button, &QPushButton::pressed, this, &Widget::handle):绑定按钮pressed 信号 到handle槽函数,pressed在按钮按下瞬间触发,区别于clicked需完成 "按下 + 松开" 才触发。
析构函数实现
Widget::~Widget()
{
delete ui;
}
析构函数释放动态创建的Ui::Widget对象,释放 UI 相关资源,避免内存泄漏。
槽函数 handle 实现
void Widget::handle()
{
// 打印窗口客户区几何信息
qDebug() << "窗口客户区几何信息(geometry):" << this->geometry();
// 打印窗口整体(含框架)几何信息
qDebug() << "窗口整体几何信息(frameGeometry):" << this->frameGeometry();
}
槽函数在按钮按下时执行,通过qDebug输出窗口的geometry()与frameGeometry()几何信息,实现两者的核心对比。
frameGeometry () 与 geometry () 的核心区别
1. 包含范围差异
- geometry() :仅描述窗口客户区 的几何信息,客户区是应用可放置控件、绘制内容的区域,不含标题栏、窗口边框。
- frameGeometry() :描述窗口完整窗体 的几何信息,包含标题栏、窗口边框、客户区,是窗口在屏幕上的全部可见范围。
2. 坐标与宽高差异结合截图输出示例:
// 截图输出结果
QRect(880,464 800x600) // geometry()
QRect(879,419 802x646) // frameGeometry()
- geometry() :
x/y:客户区左上角相对于父窗口(顶层窗口为屏幕)的坐标;width/height:客户区的宽高,仅包含应用可自主控制的绘制区域。
- frameGeometry() :
x/y:整个窗体(含框架)左上角相对于屏幕的坐标;width/height:窗体总宽高,包含标题栏、边框与客户区的总像素数。
- 从截图可见:
frameGeometry()的y坐标更小(包含标题栏高度),宽高更大(包含边框与标题栏的像素占用)。
3. 适用场景差异
- geometry() :用于客户区内 的控件布局、位置计算,比如按钮
move(100, 100)的坐标基准、绘制自定义图形的区域范围。 - frameGeometry() :用于计算窗口在屏幕上的整体位置,比如窗口居中、贴边吸附、多窗口排列等全局布局操作。
4. 数值关联关系 对于有标题栏的顶层窗口,frameGeometry()的宽高大于 geometry()的宽高,坐标位置也存在差异,差值对应窗口框架(标题栏 + 边框)的像素大小。
QWidget 核心属性之 Qlcon(设置图标)
widget.cpp
#include "widget.h" // 自定义Widget类的头文件(包含类声明)
#include "ui_widget.h" // Qt Designer自动生成的UI头文件(管理界面控件)
#include <QIcon> // Qt图标类头文件:用于加载、管理图标资源
// 构造函数:初始化Widget窗口,核心逻辑是设置窗口标题栏图标
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类QWidget的构造函数,parent为父窗口(默认无)
, ui(new Ui::Widget) // 动态创建UI对象,Qt父对象机制会自动管理其内存
{
ui->setupUi(this); // 初始化UI界面(加载Qt Designer设计的界面布局)
// ========== 1. 创建QIcon对象:加载本地图标文件 ==========
// QIcon:Qt专门用于处理图标资源的类,支持png/jpg/ico等常见图片格式
// 路径写法说明:
// - Windows系统:可使用 "/" 作为路径分隔符(推荐,跨平台兼容),如 "D:/flore.png";
// - 也可使用 "\\"(转义后的反斜杠),如 "D:\\flore.png"(仅适用于Windows);
// - 若路径错误/文件不存在,QIcon不会崩溃,仅图标显示为空白(可通过isNull()判断)。
QIcon icon("D:/flore.png");
// ========== 2. 设置窗口标题栏图标 ==========
// setWindowIcon:为当前顶层窗口设置标题栏图标(仅顶层窗口生效,子窗口/控件调用无效)
// 顶层窗口:无父窗口的QWidget/QMainWindow/QDialog等(本例Widget是顶层窗口)
this->setWindowIcon(icon);
}
// 析构函数:释放UI对象内存,避免内存泄漏
Widget::~Widget()
{
delete ui;
}

widget.cpp 代码解析
构造函数实现
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 加载本地图片创建QIcon对象
QIcon icon("D:/flore.png");
// 为当前顶层窗口设置标题栏图标
this->setWindowIcon(icon);
}
ui->setupUi(this):初始化 Qt Designer 生成的 UI 界面,加载预设的界面布局,本例未自定义控件,仅保留默认调用。QIcon icon("D:/flore.png"):创建QIcon对象,加载指定路径的图片文件作为图标资源。this->setWindowIcon(icon):调用setWindowIcon方法,将加载好的 QIcon 设置为当前窗口的标题栏图标,仅顶层窗口(无父窗口的窗口)调用该方法生效。
析构函数实现
Widget::~Widget()
{
delete ui;
}
析构函数释放动态创建的Ui::Widget对象,释放 UI 相关内存资源,避免内存泄漏。
QIcon 对象解析
QIcon 是 Qt 框架中专门用于加载、管理和渲染图标资源的核心类,支持 png、jpg、ico、svg 等常见图片格式,核心特性:
- 资源加载:可通过本地文件路径、Qt 资源路径(qrc 路径)、内存数据等方式创建 QIcon 对象;
- 空图标处理:若指定路径的文件不存在 / 格式不支持,QIcon 会创建空对象 (可通过
isNull()方法判断),不会导致程序崩溃; - 多尺寸适配:自动适配不同 DPI 下的图标显示,保证在不同分辨率设备上的视觉效果一致。
路径问题与发布风险
参数 "D:/flore.png" 含义 :该参数为图片文件的绝对路径 ,指向 D 盘根目录下名为flore.png的图片文件,是当前开发环境中图片的存储位置。
绝对路径 / 相对路径引入图标的缺陷:
- 路径不一致风险:Qt 程序最终发布到用户电脑时,无法确保用户电脑的路径结构与开发环境完全一致(比如用户没有 D 盘,或图片未放置在相同目录下),会导致图标加载失败;
- 资源易丢失风险:图标文件以独立文件形式存在,用户可能误删、移动图标文件,直接导致程序运行时图标显示空白,影响界面完整性。
qrc 资源机制解析
qrc 机制核心定义 :qrc 是 Qt 提供的资源编译机制 ,通过后缀为.qrc的 XML 格式文件,统一管理项目中的图片、样式表等资源,核心流程:
- 创建 qrc 文件 :在 Qt 项目中新增后缀为
.qrc的 XML 文件,作为资源清单文件; - 注册资源文件:在 qrc 文件的 XML 结构中,声明需要嵌入的图片、图标等资源的路径;
- 编译期嵌入 :Qt 编译项目时,会读取 qrc 文件中记录的资源信息,提取对应文件的二进制数据 ,将二进制数据转换为 C++ 代码,最终编译到生成的
.exe可执行文件中; - 运行时访问 :程序运行时通过
:/前缀的资源路径(如:/images/flore.png)访问嵌入的资源,无需依赖外部文件。
qrc 机制的优势:
- 路径可靠性:资源被编译到 exe 中,不存在路径不一致问题,程序运行时可稳定访问;
- 资源防丢失:图标资源与 exe 绑定,用户无法通过删除独立文件的方式破坏资源,保证界面资源的完整性;
- 发布简化:无需额外分发图标资源文件,仅需发布单个 exe 文件,简化部署流程。
QWidget 核心属性之 qrc
**第一步:**点击文件 -> 点击新建文件或项目

第二步:

**第三步:**填写名称(不能带中文或特殊符号),点击下一步后再点击完成即可

**第四步:**进入到 prc 文件可视化中,点击 Add Prefix

**第五步:**修改前缀为 "/" 即可(Qt 虚拟的抽象目录)

**第六步:**点击 Add Files 按钮,把要导入的图片复制到 .prc 同级目录或子目录中

看到这个路径和图标就表明导入成功了

将图片导入到 .prc 文件后,使用 QIcon 所创建出来的对象只需要加上前缀 ":" + 自定义的虚拟抽象目录 "/" + 图片名 "flore.png" 即可

QWidget 核心属性之 WindowOpacity(透明度)
widget.cpp
#include "widget.h" // 自定义Widget类的头文件
#include "ui_widget.h" // Qt Designer生成的UI头文件
#include <QPushButton> // Qt按钮控件类(创建点击按钮)
// 构造函数:初始化窗口,创建控制不透明度的按钮并绑定信号槽
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类QWidget构造函数,parent为父窗口(默认无)
, ui(new Ui::Widget) // 动态创建UI对象,由Qt父对象机制管理内存
{
ui->setupUi(this); // 初始化UI界面(本例未自定义UI,仅为默认调用)
// 1. 创建两个按钮控件,指定父对象为当前窗口(自动管理内存)
QPushButton* buttonAdd = new QPushButton(this); // 增加不透明度的按钮
QPushButton* buttonSub = new QPushButton(this); // 减少不透明度的按钮
// 2. 设置按钮显示文本
buttonAdd->setText("增加不透明度");
buttonSub->setText("减少不透明度");
// 3. 设置按钮在窗口客户区的位置(x坐标,y坐标)
buttonAdd->move(100, 100); // 增加按钮放在(100,100)位置
buttonSub->move(100, 200); // 减少按钮放在(100,200)位置
// 4. 信号槽绑定:按钮点击事件 → 对应槽函数
// clicked信号:按钮按下并松开时触发(区别于pressed仅按下触发)
connect(buttonAdd, &QPushButton::clicked, this, &Widget::handle_buttonAdd);
connect(buttonSub, &QPushButton::clicked, this, &Widget::handle_buttonSub);
}
// 析构函数:释放UI对象内存,避免内存泄漏
Widget::~Widget()
{
delete ui;
}
// 槽函数:点击"增加不透明度"按钮时执行
void Widget::handle_buttonAdd()
{
// ========== windowOpacity():获取当前窗口的不透明度 ==========
// 返回值:float类型,取值范围 0.0 ~ 1.0
// - 0.0:窗口完全透明(不可见);
// - 1.0:窗口完全不透明(默认状态);
// - 0.5:窗口半透明(中间状态)。
float opacity = this->windowOpacity();
// 边界保护:若不透明度已达到最大值1.0,直接返回(避免超出范围)
if(opacity >= 1.0)
return;
// 每次点击增加0.1的不透明度(步长可自定义)
opacity += 0.1;
// ========== setWindowOpacity():设置窗口的不透明度 ==========
// 参数:float类型,有效值范围 0.0 ~ 1.0
// - 若传入值超出范围,Qt会自动截断为0.0或1.0(但代码中加判断更严谨);
// - 该函数仅对顶层窗口生效(子控件需用setOpacity或样式表控制)。
this->setWindowOpacity(opacity);
}
// 槽函数:点击"减少不透明度"按钮时执行
void Widget::handle_buttonSub()
{
// 获取当前窗口的不透明度
float opacity = this->windowOpacity();
// 边界保护:若不透明度已达到最小值0.0,直接返回
if(opacity <= 0.0)
return;
// 每次点击减少0.1的不透明度
opacity -= 0.1;
// 设置新的不透明度
this->setWindowOpacity(opacity);
}
windowOpacity () 函数解析
windowOpacity() 是 QWidget 类的核心成员函数,专门用于获取当前窗口的不透明度数值,核心特性:
// 函数调用示例
float opacity = this->windowOpacity();
- 返回值类型:float(浮点型),是不透明度的标准数据类型;
- 核心作用:读取当前窗口的不透明度状态,返回值直接反映窗口的透明程度;
- 调用范围:仅对顶层窗口(无父窗口的 QWidget/QMainWindow 等)有效,子控件无该属性。
setWindowOpacity () 函数解析
setWindowOpacity() 是 QWidget 类的成员函数,用于设置当前窗口的不透明度数值,核心特性:
// 函数调用示例
this->setWindowOpacity(opacity);
- 参数类型:float(浮点型),需传入 0.0~1.0 范围内的数值;
- 核心作用:将窗口的不透明度更新为参数指定的值,设置后窗口的所有可视区域(客户区 + 窗口框架)立即应用新的透明状态;
- 边界处理:若传入参数超出 0.0~1.0 范围,Qt 会自动截断为边界值(如传入 1.5 则按 1.0 处理,传入 - 0.2 则按 0.0 处理),但开发中建议先做边界判断,提升代码严谨性。
不透明度数值规则
不透明度的计量单位为float(浮点型),数值范围与含义严格遵循以下规则:
- 最大值 1.0 :窗口处于完全不透明状态,这是 Qt 窗口的默认状态,窗口所有内容清晰可见,无任何透明效果;
- 最小值 0.0 :窗口处于完全透明状态,视觉上窗口完全不可见,仅保留窗口的交互区域(若有);
- 中间值(0.0~1.0) :窗口处于半透明状态,数值越接近 1.0,不透明度越高(越清晰);数值越接近 0.0,透明度越高(越模糊),例如 0.5 代表窗口半透明。
总结
windowOpacity()以 float 类型返回当前窗口不透明度,setWindowOpacity()接收 float 类型参数设置窗口不透明度;- 不透明度的数值范围为 0.0(完全透明)~1.0(完全不透明),单位为 float;
setWindowOpacity()仅对顶层窗口生效,参数超出范围时 Qt 会自动截断为边界值。
QWidget 核心属性之 cursor(光标形状)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 新增:创建按钮控件,指定父窗口为当前Widget
QPushButton* button = new QPushButton(this);
button->setText("按钮");
// 新增:设置按钮的位置和大小(x=100, y=100, 宽200, 高100)
button->setGeometry(100,100,200,100);
// 新增:创建QCursor光标对象
// QCursor:Qt用于描述鼠标光标形状的类,构造时可指定预定义的光标枚举类型
// 参数Qt::WaitCursor:预定义光标类型,表示"等待/加载"光标(通常显示为转圈的沙漏/圆圈)
QCursor cursor(Qt::WaitCursor);
// 新增:调用setCursor函数为按钮设置自定义光标
// setCursor(QCursor):为目标控件设置鼠标悬浮时显示的光标形状
// 效果:当鼠标移动到该按钮区域时,光标会从默认箭头变为"等待"样式
button->setCursor(cursor);
}
Widget::~Widget()
{
delete ui;
}
QCursor 对象解析
QCursor 是 Qt 框架中专门用于描述鼠标光标形状的核心类,核心作用是定义鼠标悬浮在控件 / 窗口上时显示的光标样式,核心特性:
// QCursor对象创建示例
QCursor cursor(Qt::WaitCursor);
- 构造参数:支持 Qt 预定义的光标枚举类型(如
Qt::WaitCursor(等待光标)、Qt::ArrowCursor(默认箭头)、Qt::PointingHandCursor(手型光标)等),也可自定义光标图片; - 数据特性:QCursor 仅封装光标形状的枚举值 / 自定义图片路径等轻量数据,属于值类型对象(而非指针类型的资源型对象);
- 内存管理:QCursor 无需通过
new创建的核心原因:- 该类是轻量级功能对象,仅存储少量数据(如光标类型枚举值),栈上创建(直接声明)的内存开销远低于堆上创建(new),且栈对象会在作用域结束时自动销毁,无需手动释放;
- Qt 的
setCursor函数接收的是QCursor值(而非指针),函数内部会自动拷贝该对象的内容,即使栈对象销毁,控件已保存的光标配置不受影响; - 这类小型功能对象不具备 Qt 对象树(父子对象)能力 :Qt 对象树机制仅针对继承
QObject的类(如 QWidget、QPushButton),用于自动管理堆上创建的资源型对象;而 QCursor 未继承QObject,无parent属性,无法加入对象树,因此堆上创建(new)后需手动delete,反而增加内存泄漏风险,栈上创建是更优选择。
setCursor 函数解析
setCursor 是 QWidget 类的成员函数,核心作用是为目标控件设置鼠标悬浮时显示的光标形状,核心特性:
// setCursor函数调用示例
button->setCursor(cursor);
- 函数参数:接收
QCursor类型的对象(值传递),函数内部会拷贝该 QCursor 对象的光标配置,与原对象生命周期解耦; - 生效范围:仅对调用该函数的控件生效,示例中为
button设置Qt::WaitCursor后,鼠标悬浮在按钮区域时,光标会从默认箭头变为 "等待 / 加载" 样式(通常为转圈的沙漏 / 圆圈),离开按钮区域后恢复系统默认光标; - 重置方式:若需恢复默认光标,可调用
setCursor(Qt::ArrowCursor)(传入默认箭头光标)或unsetCursor()函数。
小型功能对象的对象树特性补充
类似于 QCursor 的 Qt 小型功能对象(如 QRect、QSize、QPoint、QColor 等),均具备以下共性:
- 未继承
QObject,无parent属性,不具备对象树管理能力,无法通过父对象自动释放内存; - 仅封装单一功能的轻量数据,栈上创建(直接声明)是标准用法,堆上创建(new)无任何优势,反而增加手动释放的成本;
- 这类对象通常以值传递的方式在函数间传递,Qt 的控件类成员函数会自动拷贝其内容,无需担心对象生命周期问题。
总结
- QCursor 是描述鼠标光标形状的轻量级类,未继承 QObject,无对象树能力,栈上创建(无需 new)是最优方式,内存开销低且无需手动释放;
- setCursor 函数为控件设置鼠标悬浮光标,接收 QCursor 值参数,仅对目标控件生效;
- 未继承 QObject 的小型功能对象(如 QCursor、QRect)均无对象树能力,栈上创建是标准开发习惯。
qrc + cursor(自定义光标形状)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QPixmap>
#include <QCursor>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 从Qt资源文件加载图片
// ":/test.png" 是Qt资源路径格式:前缀 ":/" 对应项目中 .qrc 资源文件的声明
// QPixmap 是Qt专门处理像素图的类,负责加载、缩放、渲染图片(支持png/jpg等格式)
QPixmap pixmap(":/test.png");
// 2. 将图片缩放到 100×100 像素(适配光标尺寸)
// scaled(宽, 高):调整图片大小,默认保持宽高比;这里强制缩放到100×100
pixmap = pixmap.scaled(100, 100);
// 3. 用自定义像素图创建 QCursor 光标对象
// 构造函数 QCursor(QPixmap):将图片作为鼠标光标形状
// 默认热点(hotspot)为图片左上角(0,0)------即鼠标点击时,实际响应点是图片左上角
// 自定义热点为(50,50)(比如让图片中心响应点击)
QCursor cursor(pixmap, 50, 50);
// 4. 为整个窗口设置自定义光标
// this->setCursor(cursor):将光标应用到当前顶层窗口
// 效果:鼠标移动到窗口任意区域时,会显示为自定义的 test.png 图片光标
this->setCursor(cursor);
}
Widget::~Widget()
{
delete ui;
}
QPixmap 对象解析
QPixmap 是 Qt 框架中专门用于处理像素图的核心类,核心职责是加载、存储、缩放、渲染位图图像(支持 png、jpg、bmp、ico 等主流图片格式),针对屏幕显示做了深度优化(区别于 QImage 侧重像素级操作),适合作为光标、控件背景等可视化元素的图像载体,代码示例:
QPixmap pixmap(":/test.png");
- 资源路径:
":/test.png"是 Qt 资源文件(.qrc)的标准路径格式,前缀:/表示从编译到 exe 中的资源中读取图片,而非本地文件路径; - 内存特性:QPixmap 属于轻量级值类型对象,栈上创建即可,无需通过
new分配堆内存,作用域结束时自动释放; - 核心能力:支持缩放、裁剪、旋转等基础图像操作,是 Qt 中实现自定义光标、图片按钮的核心依赖类。
pixmap.scaled (100, 100) 函数解析
scaled() 是 QPixmap 类的成员函数,核心作用是将像素图缩放到指定尺寸,返回缩放后的新 QPixmap 对象,代码示例:
pixmap = pixmap.scaled(100, 100);
- 参数含义:第一个参数为目标宽度(100 像素),第二个参数为目标高度(100 像素);
- 缩放规则:
- 该函数默认按 "保持宽高比" 缩放,但示例中未传入额外参数,直接强制缩放到 100×100 像素(若原图片宽高比与 1:1 不符,会出现拉伸变形);
- 若需保持宽高比,可补充参数
Qt::KeepAspectRatio,如pixmap.scaled(100, 100, Qt::KeepAspectRatio); - 生效逻辑:scaled () 不会修改原 QPixmap 对象,需将返回值赋值回 pixmap 变量,缩放效果才会生效;
- 适配场景:光标尺寸通常较小,将图片缩放到 100×100 像素是为了适配光标显示的视觉效果,避免图片过大 / 过小导致光标显示异常。
cursor (pixmap, 50, 50) 构造函数解析
QCursor(QPixmap pixmap, int hotX, int hotY) 是 QCursor 的重载构造函数,核心作用是创建基于自定义像素图的光标对象,代码示例:
QCursor cursor(pixmap, 50, 50);
- 第一个参数
pixmap:作为光标显示的像素图(已缩放到 100×100); - 第二个参数
50:光标热点的水平坐标(hotX); - 第三个参数
50:光标热点的垂直坐标(hotY); - 对比默认构造:若仅传入 pixmap(
QCursor(pixmap)),热点默认是图片左上角 (0,0),示例中手动指定为 (50,50),即图片的中心位置。
光标热点(hotspot)解析
光标热点(hotspot) 是自定义光标中实际响应鼠标交互的像素点,核心特性:
- 定义:热点是光标图片上的一个坐标点,该点与系统识别的 "鼠标实际位置" 一一对应,所有鼠标事件(点击、移动、悬浮)均以该点为基准触发;
- 示例含义:示例中热点坐标为 (50,50),对应 100×100 像素图片的中心位置,意味着当鼠标显示该自定义光标时,系统识别的 "鼠标位置" 是图片中心,而非默认的左上角;
- 实际作用:热点位置直接影响交互精度,例如拖拽操作的起始点判定、按钮点击的命中区域、坐标拾取的准确性等,需根据光标图片的视觉中心 / 功能中心设置(如十字光标通常将热点设为中心)。
总结
- QPixmap 是 Qt 针对屏幕显示优化的像素图类,用于加载 / 处理图片资源,支持资源文件路径;
- scaled (100,100) 将像素图强制缩放到 100×100 像素,需赋值返回值才能生效;
- QCursor (pixmap,50,50) 创建自定义图片光标,50,50 是光标热点的坐标;
- 光标热点是鼠标交互的基准点,决定了鼠标事件的实际响应位置。
QWidget 核心属性之 font(字体设置)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QFont>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 新增:创建QLabel标签控件,指定父窗口为当前Widget(Qt自动管理内存)
QLabel* label = new QLabel(this);
// 新增:设置标签显示的文本内容
label->setText("这是一段文本.");
// 新增:设置标签在窗口客户区的位置(x=100, y=100)
label->move(100,100);
// 新增:创建QFont字体对象------Qt用于描述字体样式的核心类
QFont font;
// 1. 设置字体家族(字体名称):"仿宋"为系统自带中文字体,也可设"微软雅黑"/"宋体"等
font.setFamily("仿宋");
// 2. 设置字体像素大小:30px(优先级高于setPointSize,更适合屏幕显示)
font.setPixelSize(30);
// 3. 设置字体加粗:true为加粗,false为常规(默认)
font.setBold(true);
// 4. 设置字体斜体:true为斜体,false为常规(默认)
font.setItalic(true);
// 5. 设置文本下划线:true显示下划线,false不显示(默认)
font.setUnderline(true);
// 6. 设置文本删除线:true显示删除线,false不显示(默认)
font.setStrikeOut(true);
// 新增:将配置好的字体应用到标签控件
// setFont(QFont):为QLabel(或其他文本类控件)设置字体样式,立即生效
label->setFont(font);
}
Widget::~Widget()
{
delete ui;
}
QLabel 对象解析
QLabel 是 Qt 框架中用于显示文本、图片或超链接的基础控件类,继承自 QWidget,是 GUI 界面中展示静态内容的核心组件,代码示例:
QLabel* label = new QLabel(this);
label->setText("这是一段文本.");
label->move(100,100);
- 核心能力:
- 文本显示 :通过
setText()设置任意文本内容(支持普通字符串、HTML 格式文本,如<font color="red">红色文本</font>); - 布局特性 :通过
move(x,y)设置在父窗口客户区的坐标位置,也可结合布局管理器(如 QVBoxLayout)实现自适应布局; - 内存管理 :创建时指定父对象为当前 Widget(
this),Qt 对象树机制自动管理内存,无需手动delete; - 扩展能力 :除文本外,还可通过
setPixmap()显示图片、setOpenExternalLinks(true)支持超链接跳转,是轻量化且多功能的显示控件。
- 文本显示 :通过
QFont 对象解析
QFont 是 Qt 框架中专门用于描述字体样式属性 的核心类,封装了字体家族、大小、粗细、斜体、下划线等所有字体相关配置,属于轻量级值类型对象(无需new创建,栈上声明即可),代码示例:
QFont font;
font.setFamily("仿宋");
font.setPixelSize(30);
font.setBold(true);
font.setItalic(true);
font.setUnderline(true);
font.setStrikeOut(true);
label->setFont(font);
- 核心配置方法解析:
- setFamily():设置字体家族(字体名称),参数为系统已安装的字体名称(如 "仿宋""微软雅黑""宋体""Arial" 等),若指定字体不存在,Qt 会自动使用系统默认字体替代;
- setPixelSize() :设置字体像素大小(单位:像素),优先级高于
setPointSize()(点大小),更适配屏幕显示场景,示例中设为 30px,文本显示尺寸更大; - setBold() :设置字体加粗,
true为加粗样式,false为常规样式(默认); - setItalic() :设置字体斜体,
true为斜体样式,false为常规样式(默认); - setUnderline() :设置文本下划线,
true显示下划线,false不显示(默认); - setStrikeOut() :设置文本删除线,
true显示删除线,false不显示(默认);
- 生效逻辑:配置完成的 QFont 对象需通过控件的
setFont()方法(如label->setFont(font))应用到文本类控件(QLabel、QPushButton、QLineEdit 等),设置后控件的文本样式立即更新; - 内存特性:QFont 未继承 QObject,无对象树能力,栈上创建即可,作用域结束时自动销毁,控件调用
setFont()时会拷贝 QFont 的配置,无需担心对象生命周期问题。
总结
- QLabel 是 Qt 的基础显示控件,支持文本 / 图片 / 超链接展示,指定父对象后由 Qt 自动管理内存;
- QFont 是描述字体样式的轻量级类,可配置字体家族、大小、加粗、斜体等属性,通过控件的 setFont () 生效。
QWidget 核心属性之 toolTip(按键说明)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建QPushButton按钮控件,指定当前Widget为父对象,由Qt自动管理内存
QPushButton* buttonYes = new QPushButton(this);
// 设置按钮上显示的文本内容为"Yes"
buttonYes->setText("Yes");
// 将按钮移动到窗口客户区的(100, 100)坐标位置(x轴100,y轴100)
buttonYes->move(100, 100);
// 设置按钮的工具提示文本,鼠标悬浮在按钮上时会弹出该提示
buttonYes->setToolTip("这是一个 yes 按钮");
// 设置工具提示的显示时长为5000毫秒(5秒),超时后提示框自动消失
buttonYes->setToolTipDuration(5000);
}
Widget::~Widget()
{
delete ui;
}
setToolTip 函数解析
setToolTip 是 QWidget 类的成员函数,核心作用是为目标控件设置鼠标悬浮时显示的工具提示文本,是提升 GUI 界面用户体验的基础功能,代码示例:
buttonYes->setToolTip("这是一个 yes 按钮");
- 函数参数:字符串类型(QString/const char*),即提示文本内容,支持普通文本,也兼容简单 HTML 格式(如
<font color="blue">蓝色提示</font>); - 生效逻辑:设置后,鼠标悬浮在该按钮(buttonYes)区域时,会自动弹出包含指定文本的浅色提示框,鼠标移开控件区域后提示框立即消失;
- 通用特性:该函数继承自 QWidget,所有 Qt 控件(QLabel、QLineEdit、QCheckBox 等)均可调用,是 Qt 控件的通用工具提示配置接口。
setToolTipDuration 函数解析
setToolTipDuration 是 QWidget 类的成员函数,核心作用是设置工具提示框的自动消失时长,代码示例:
buttonYes->setToolTipDuration(5000);
- 函数参数:整型(int),单位为毫秒(ms),示例中参数 5000 表示提示框显示 5 秒后自动消失;
- 核心规则:
- 未调用该函数时,提示框的默认显示时长由系统设置决定(通常为 2-3 秒);
- 参数为正数:提示框在鼠标悬浮期间,显示达到指定毫秒数后自动消失(即使鼠标仍悬浮在控件上);
- 参数为 - 1:提示框会持续显示,直到鼠标移开控件区域才消失(覆盖系统默认时长);
- 生效范围:该设置仅对当前控件的工具提示生效,不同控件可独立配置不同的提示时长;
- 注意事项:工具提示的触发逻辑仍为 "鼠标悬浮",该函数仅控制 "悬浮期间提示框的最大显示时长",鼠标移开时提示框会立即消失,不受时长限制。
总结
- setToolTip 用于为控件配置鼠标悬浮时显示的工具提示文本,支持普通文本和简单 HTML 格式;
- setToolTipDuration 用于设置提示框的自动消失时长,单位为毫秒,参数 - 1 表示提示框随鼠标悬浮持续显示。
QWidget 核心属性之 focusPolicy(设置焦点)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建QLineEdit输入框控件,指定当前Widget为父对象,由Qt自动管理内存
QLineEdit* edit = new QLineEdit(this);
// 创建第二个QLineEdit输入框控件
QLineEdit* editOnlyTab = new QLineEdit(this);
// 创建第三个QLineEdit输入框控件
QLineEdit* editOnlyClick = new QLineEdit(this);
// 创建第四个QLineEdit输入框控件
QLineEdit* editNoFocus = new QLineEdit(this);
// 将第一个输入框移动到窗口客户区(100, 100)坐标位置
edit->move(100, 100);
// 将第二个输入框移动到窗口客户区(100, 200)坐标位置
editOnlyTab->move(100, 200);
// 将第三个输入框移动到窗口客户区(100, 300)坐标位置
editOnlyClick->move(100, 300);
// 将第四个输入框移动到窗口客户区(100, 400)坐标位置
editNoFocus->move(100, 400);
// 设置第一个输入框的默认显示文本为"default StrongFocus"
edit->setText("default StrongFocus");
// 设置第二个输入框的显示文本为"set OnlyTab"
editOnlyTab->setText("set OnlyTab");
// 设置第三个输入框的显示文本为"set OnlyClick"
editOnlyClick->setText("set OnlyClick");
// 设置第四个输入框的显示文本为"set NoFocus"
editNoFocus->setText("set NoFocus");
// 设置第二个输入框的焦点策略为TabFocus:仅能通过Tab键获取焦点,鼠标点击无法获取
editOnlyTab->setFocusPolicy(Qt::TabFocus);
// 设置第三个输入框的焦点策略为ClickFocus:仅能通过鼠标点击获取焦点,Tab键无法获取
editOnlyClick->setFocusPolicy(Qt::ClickFocus);
// 设置第四个输入框的焦点策略为NoFocus:无法通过任何方式获取焦点,无法输入内容
editNoFocus->setFocusPolicy(Qt::NoFocus);
}
Widget::~Widget()
{
delete ui;
}
QLineEdit 对象解析
QLineEdit 是 Qt 框架中专门用于单行文本输入 / 编辑的核心控件类,继承自 QWidget,是 GUI 界面中接收用户文本输入的基础组件,代码示例:
QLineEdit* edit = new QLineEdit(this);
edit->move(100, 100);
edit->setText("default StrongFocus");
- 核心能力:支持普通文本输入、密码掩码(
setEchoMode)、输入验证(setValidator)、占位符文本(setPlaceholderText)等单行文本交互功能; - 内存管理:创建时指定父对象为当前 Widget(
this),Qt 对象树机制自动管理内存,无需手动delete; - 焦点特性:QLineEdit 作为输入类控件,默认具备焦点交互能力(可获取键盘焦点输入文本),是区别于纯显示控件(如 QLabel)的核心特征。
setFocusPolicy 函数解析
setFocusPolicy 是 QWidget 类的成员函数,核心作用是设置控件获取键盘焦点的方式,决定用户可通过哪些操作让控件获得焦点(获得焦点后才能响应键盘输入),函数原型及调用示例:
// 函数原型
void QWidget::setFocusPolicy(Qt::FocusPolicy policy);
// 调用示例
editOnlyTab->setFocusPolicy(Qt::TabFocus);
editOnlyClick->setFocusPolicy(Qt::ClickFocus);
editNoFocus->setFocusPolicy(Qt::NoFocus);
- 函数参数:
Qt::FocusPolicy枚举类型,核心取值及含义:- Qt::TabFocus :控件仅能通过Tab 键切换获取焦点,鼠标点击该控件无法触发焦点获取,示例中第二个输入框(editOnlyTab)配置此策略后,鼠标点击无响应,仅按 Tab 键可使其获得焦点;
- Qt::ClickFocus :控件仅能通过鼠标点击获取焦点,按 Tab 键切换焦点时会跳过该控件,示例中第三个输入框(editOnlyClick)配置此策略后,Tab 键无法选中,仅鼠标点击可使其获得焦点;
- Qt::NoFocus :控件无法通过任何方式获取焦点(Tab 键、鼠标点击均无效),获得该策略的控件无法响应键盘输入,示例中第四个输入框(editNoFocus)配置此策略后,无法输入 / 编辑文本;
- Qt::StrongFocus :控件可通过Tab 键切换 和鼠标点击两种方式获取焦点,是 QLineEdit、QPushButton 等交互类控件的默认焦点策略。
第一个输入框的默认焦点策略(Qt::StrongFocus)
第一个输入框(edit)未显式调用setFocusPolicy,其焦点策略默认值为Qt::StrongFocus,核心特性:
// 隐式默认配置,无需手动调用
edit->setFocusPolicy(Qt::StrongFocus);
- 交互逻辑:该输入框可通过两种方式获取焦点:
- 按 Tab 键在控件间切换时,会选中该输入框并获得焦点(可输入文本);
- 鼠标点击该输入框区域时,立即获得焦点(可输入文本);
- 设计逻辑:Qt 将
Qt::StrongFocus设为 QLineEdit 的默认焦点策略,是因为单行输入框作为核心交互控件,需要兼容 "键盘操作(Tab 切换)" 和 "鼠标操作(点击选中)" 两种主流用户交互习惯,保证输入体验的通用性。
总结
- QLineEdit 是 Qt 单行文本输入控件,支持文本输入 / 编辑,默认具备焦点交互能力;
- setFocusPolicy 用于设置控件获取焦点的方式,参数包含 TabFocus(仅 Tab 键)、ClickFocus(仅鼠标点击)、NoFocus(无焦点)、StrongFocus(Tab + 点击);
- QLineEdit 默认焦点策略为 StrongFocus,兼容 Tab 键和鼠标点击两种焦点获取方式。
QWidget 核心属性之 styleSheet(设置界面样式)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
// 补充:已在widget.h的Widget类中声明以下头文件和成员
// #include <QPushButton>
//
// private:
// QPushButton *buttonLight; // 日间模式按钮
// QPushButton *buttonDark; // 夜间模式按钮
// private slots:
// void handle_ButtonLight(); // 日间模式槽函数
// void handle_ButtonDark(); // 夜间模式槽函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建QPushButton按钮控件,指定当前Widget为父对象,由Qt自动管理内存
buttonLight = new QPushButton(this);
// 创建第二个QPushButton按钮控件
buttonDark = new QPushButton(this);
// 将"日间模式"按钮移动到窗口客户区(100, 100)坐标位置
buttonLight->move(100, 100);
// 将"夜间模式"按钮移动到窗口客户区(100, 200)坐标位置
buttonDark->move(100, 200);
// 设置"日间模式"按钮显示的文本内容
buttonLight->setText("日间模式");
// 设置"夜间模式"按钮显示的文本内容
buttonDark->setText("夜间模式");
// 绑定"日间模式"按钮的点击信号到对应的槽函数
connect(buttonLight, &QPushButton::clicked, this, &Widget::handle_ButtonLight);
// 绑定"夜间模式"按钮的点击信号到对应的槽函数
connect(buttonDark, &QPushButton::clicked, this, &Widget::handle_ButtonDark);
}
Widget::~Widget()
{
delete ui;
}
// 点击"日间模式"按钮触发的槽函数
void Widget::handle_ButtonLight()
{
// 设置当前窗口的背景颜色为浅灰色(rgb三通道值均为240)
this->setStyleSheet("background-color: rgb(240, 240, 240);");
// 设置"日间模式"按钮的文本颜色为黑色
this->buttonLight->setStyleSheet("color: black;");
// 设置"夜间模式"按钮的文本颜色为黑色
this->buttonDark->setStyleSheet("color: black;");
}
// 点击"夜间模式"按钮触发的槽函数
void Widget::handle_ButtonDark()
{
// 设置当前窗口的背景颜色为纯黑色
this->setStyleSheet("background-color: black;");
// 设置"日间模式"按钮的文本颜色为白色
this->buttonLight->setStyleSheet("color: white;");
// 设置"夜间模式"按钮的文本颜色为白色
this->buttonDark->setStyleSheet("color: white;");
}
setStyleSheet 函数解析
setStyleSheet 是 QWidget 类的核心成员函数,用于为控件设置Qt 样式表(Qt Style Sheet,QSS),实现控件外观(颜色、大小、边框、字体等)的自定义,其语法兼容 CSS 核心规则,是 Qt 中美化 GUI 界面的核心方式,代码示例:
// 为窗口设置背景颜色
this->setStyleSheet("background-color: rgb(240, 240, 240);");
// 为按钮设置文本颜色
this->buttonLight->setStyleSheet("color: black;");
- 函数特性:
- 继承性:父控件设置的样式表会默认继承给子控件(如窗口设置背景色,子按钮不会继承背景色,但文本颜色等部分属性可继承);
- 覆盖性:为子控件单独设置样式表时,会覆盖父控件继承的同名样式(如按钮单独设置 color,不会受窗口样式表影响);
- 通用性:所有继承 QWidget 的控件(QPushButton、QLabel、QLineEdit 等)均可调用该函数,独立配置样式。
setStyleSheet 函数参数解析
setStyleSheet 的参数为字符串类型(const char*/QString) ,字符串内容需遵循Qt Style Sheet 语法规则,核心格式为「属性名:属性值;」,代码中涉及的核心参数示例:
// 参数1:设置背景颜色为浅灰色
"background-color: rgb(240, 240, 240);"
// 参数2:设置文本颜色为黑色
"color: black;"
// 参数3:设置文本颜色为白色
"color: white;"
// 参数4:设置背景颜色为纯黑色
"background-color: black;"
- 核心属性解析:
- background-color:控件的背景颜色属性,用于定义控件的背景填充色;
- color:控件的文本颜色属性,用于定义控件内显示文本的颜色;
- 取值规则:
- 颜色值可使用预定义颜色名(如 black、white、red、blue 等),Qt 内置了常见颜色的英文名称映射;
- 颜色值也可使用rgb () 函数自定义颜色,是更灵活的颜色表示方式。
rgb 颜色表示法解析
rgb是一种基于红(Red)、绿(Green)、蓝(Blue)三原色通道的颜色表示方法,是 Qt 样式表中自定义颜色的核心方式,代码示例:
// rgb(240, 240, 240):浅灰色
this->setStyleSheet("background-color: rgb(240, 240, 240);");
- 语法格式:
rgb(红通道值, 绿通道值, 蓝通道值); - 取值规则:三个通道的取值范围均为0 ~ 255(整数),0 表示该通道无颜色,255 表示该通道颜色最饱和;
- 颜色组合逻辑:
- 三个通道值相等时,生成灰度色:值为 0 时是纯黑色(rgb (0,0,0)),值为 255 时是纯白色(rgb (255,255,255)),值为 240 时是浅灰色(rgb (240,240,240));
- 三个通道值不同时,生成彩色(如 rgb (255,0,0) 为纯红色,rgb (0,255,0) 为纯绿色,rgb (0,0,255) 为纯蓝色)。
总结
- setStyleSheet 是 QWidget 的成员函数,通过 Qt 样式表字符串自定义控件外观,支持背景色、文本色等样式配置;
- 函数参数为遵循 QSS 语法的字符串,核心格式为「属性名:属性值;」,颜色值可使用预定义名称或 rgb ();
- rgb 颜色表示法通过红、绿、蓝三通道(0-255)组合颜色,三通道值相等时生成灰度色。