Qt 开发【第三篇】——— 核心属性解析与应用实践

目录

[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) 构造函数解析)

光标热点(hotspot)解析

总结
[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)的具体表现

  1. 输入事件拦截:禁用的控件无法接收任何用户输入事件(鼠标点击、键盘输入、鼠标悬停等)。例如禁用后的 button_1,即使绑定了 clicked 信号与槽函数,点击也不会触发信号,槽函数不会执行。
  2. 外观变化:禁用的控件会自动呈现灰显样式(视觉上的灰色效果),与可用状态形成明显区分,直观提示用户该控件不可操作。
  3. 子元素继承禁用状态 :若父 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);
    }
}

总结

  1. QWidget 的 enabled 属性决定控件是否可用,禁用状态下控件灰显、无法接收输入事件,且父控件禁用会导致所有子控件继承禁用状态。
  2. 代码中通过 button_enable 的点击事件触发槽函数,利用isEnabled()获取 button_1 当前状态,通过setEnabled()反向设置状态,实现可用 / 禁用的切换。
  3. 禁用后的 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 像素。

总结

  1. geometry 属性管理控件的位置(x/y)和大小(width/height),setGeometry 支持 "四整型参数" 和 "QRect 对象" 两种传参方式,分别适配初始化和动态修改场景。
  2. QRect 是封装几何属性的值类型对象,修改其属性后需调用 setGeometry 才能同步到控件。
  3. 按钮平移的核心逻辑是调整位置属性的同时反向调整大小属性,保持控件自身尺寸不变,所有几何参数的单位均为像素点。

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 代表窗口半透明。

总结

  1. windowOpacity()以 float 类型返回当前窗口不透明度,setWindowOpacity()接收 float 类型参数设置窗口不透明度;
  2. 不透明度的数值范围为 0.0(完全透明)~1.0(完全不透明),单位为 float;
  3. 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创建的核心原因:
    1. 该类是轻量级功能对象,仅存储少量数据(如光标类型枚举值),栈上创建(直接声明)的内存开销远低于堆上创建(new),且栈对象会在作用域结束时自动销毁,无需手动释放;
    2. Qt 的setCursor函数接收的是QCursor值(而非指针),函数内部会自动拷贝该对象的内容,即使栈对象销毁,控件已保存的光标配置不受影响;
    3. 这类小型功能对象不具备 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 的控件类成员函数会自动拷贝其内容,无需担心对象生命周期问题。

总结

  1. QCursor 是描述鼠标光标形状的轻量级类,未继承 QObject,无对象树能力,栈上创建(无需 new)是最优方式,内存开销低且无需手动释放;
  2. setCursor 函数为控件设置鼠标悬浮光标,接收 QCursor 值参数,仅对目标控件生效;
  3. 未继承 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 像素);
  • 缩放规则:
    1. 该函数默认按 "保持宽高比" 缩放,但示例中未传入额外参数,直接强制缩放到 100×100 像素(若原图片宽高比与 1:1 不符,会出现拉伸变形);
    2. 若需保持宽高比,可补充参数Qt::KeepAspectRatio,如pixmap.scaled(100, 100, Qt::KeepAspectRatio)
    3. 生效逻辑: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 像素图片的中心位置,意味着当鼠标显示该自定义光标时,系统识别的 "鼠标位置" 是图片中心,而非默认的左上角;
  • 实际作用:热点位置直接影响交互精度,例如拖拽操作的起始点判定、按钮点击的命中区域、坐标拾取的准确性等,需根据光标图片的视觉中心 / 功能中心设置(如十字光标通常将热点设为中心)。

总结

  1. QPixmap 是 Qt 针对屏幕显示优化的像素图类,用于加载 / 处理图片资源,支持资源文件路径;
  2. scaled (100,100) 将像素图强制缩放到 100×100 像素,需赋值返回值才能生效;
  3. QCursor (pixmap,50,50) 创建自定义图片光标,50,50 是光标热点的坐标;
  4. 光标热点是鼠标交互的基准点,决定了鼠标事件的实际响应位置。

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);
  • 核心能力:
    1. 文本显示 :通过setText()设置任意文本内容(支持普通字符串、HTML 格式文本,如<font color="red">红色文本</font>);
    2. 布局特性 :通过move(x,y)设置在父窗口客户区的坐标位置,也可结合布局管理器(如 QVBoxLayout)实现自适应布局;
    3. 内存管理 :创建时指定父对象为当前 Widget(this),Qt 对象树机制自动管理内存,无需手动delete
    4. 扩展能力 :除文本外,还可通过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);
  • 核心配置方法解析:
    1. setFamily():设置字体家族(字体名称),参数为系统已安装的字体名称(如 "仿宋""微软雅黑""宋体""Arial" 等),若指定字体不存在,Qt 会自动使用系统默认字体替代;
    2. setPixelSize() :设置字体像素大小(单位:像素),优先级高于setPointSize()(点大小),更适配屏幕显示场景,示例中设为 30px,文本显示尺寸更大;
    3. setBold() :设置字体加粗,true为加粗样式,false为常规样式(默认);
    4. setItalic() :设置字体斜体,true为斜体样式,false为常规样式(默认);
    5. setUnderline() :设置文本下划线,true显示下划线,false不显示(默认);
    6. setStrikeOut() :设置文本删除线,true显示删除线,false不显示(默认);
  • 生效逻辑:配置完成的 QFont 对象需通过控件的setFont()方法(如label->setFont(font))应用到文本类控件(QLabel、QPushButton、QLineEdit 等),设置后控件的文本样式立即更新;
  • 内存特性:QFont 未继承 QObject,无对象树能力,栈上创建即可,作用域结束时自动销毁,控件调用setFont()时会拷贝 QFont 的配置,无需担心对象生命周期问题。

总结

  1. QLabel 是 Qt 的基础显示控件,支持文本 / 图片 / 超链接展示,指定父对象后由 Qt 自动管理内存;
  2. 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 秒后自动消失;
  • 核心规则:
    1. 未调用该函数时,提示框的默认显示时长由系统设置决定(通常为 2-3 秒);
    2. 参数为正数:提示框在鼠标悬浮期间,显示达到指定毫秒数后自动消失(即使鼠标仍悬浮在控件上);
    3. 参数为 - 1:提示框会持续显示,直到鼠标移开控件区域才消失(覆盖系统默认时长);
  • 生效范围:该设置仅对当前控件的工具提示生效,不同控件可独立配置不同的提示时长;
  • 注意事项:工具提示的触发逻辑仍为 "鼠标悬浮",该函数仅控制 "悬浮期间提示框的最大显示时长",鼠标移开时提示框会立即消失,不受时长限制。

总结

  1. setToolTip 用于为控件配置鼠标悬浮时显示的工具提示文本,支持普通文本和简单 HTML 格式;
  2. 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枚举类型,核心取值及含义:
    1. Qt::TabFocus :控件仅能通过Tab 键切换获取焦点,鼠标点击该控件无法触发焦点获取,示例中第二个输入框(editOnlyTab)配置此策略后,鼠标点击无响应,仅按 Tab 键可使其获得焦点;
    2. Qt::ClickFocus :控件仅能通过鼠标点击获取焦点,按 Tab 键切换焦点时会跳过该控件,示例中第三个输入框(editOnlyClick)配置此策略后,Tab 键无法选中,仅鼠标点击可使其获得焦点;
    3. Qt::NoFocus :控件无法通过任何方式获取焦点(Tab 键、鼠标点击均无效),获得该策略的控件无法响应键盘输入,示例中第四个输入框(editNoFocus)配置此策略后,无法输入 / 编辑文本;
    4. Qt::StrongFocus :控件可通过Tab 键切换鼠标点击两种方式获取焦点,是 QLineEdit、QPushButton 等交互类控件的默认焦点策略。

第一个输入框的默认焦点策略(Qt::StrongFocus)

第一个输入框(edit)未显式调用setFocusPolicy,其焦点策略默认值为Qt::StrongFocus,核心特性:

复制代码
// 隐式默认配置,无需手动调用
edit->setFocusPolicy(Qt::StrongFocus);
  • 交互逻辑:该输入框可通过两种方式获取焦点:
    1. 按 Tab 键在控件间切换时,会选中该输入框并获得焦点(可输入文本);
    2. 鼠标点击该输入框区域时,立即获得焦点(可输入文本);
  • 设计逻辑:Qt 将Qt::StrongFocus设为 QLineEdit 的默认焦点策略,是因为单行输入框作为核心交互控件,需要兼容 "键盘操作(Tab 切换)" 和 "鼠标操作(点击选中)" 两种主流用户交互习惯,保证输入体验的通用性。

总结

  1. QLineEdit 是 Qt 单行文本输入控件,支持文本输入 / 编辑,默认具备焦点交互能力;
  2. setFocusPolicy 用于设置控件获取焦点的方式,参数包含 TabFocus(仅 Tab 键)、ClickFocus(仅鼠标点击)、NoFocus(无焦点)、StrongFocus(Tab + 点击);
  3. 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;");
  • 函数特性:
    1. 继承性:父控件设置的样式表会默认继承给子控件(如窗口设置背景色,子按钮不会继承背景色,但文本颜色等部分属性可继承);
    2. 覆盖性:为子控件单独设置样式表时,会覆盖父控件继承的同名样式(如按钮单独设置 color,不会受窗口样式表影响);
    3. 通用性:所有继承 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;"
  • 核心属性解析:
    1. background-color:控件的背景颜色属性,用于定义控件的背景填充色;
    2. color:控件的文本颜色属性,用于定义控件内显示文本的颜色;
  • 取值规则:
    1. 颜色值可使用预定义颜色名(如 black、white、red、blue 等),Qt 内置了常见颜色的英文名称映射;
    2. 颜色值也可使用rgb () 函数自定义颜色,是更灵活的颜色表示方式。

rgb 颜色表示法解析

rgb是一种基于红(Red)、绿(Green)、蓝(Blue)三原色通道的颜色表示方法,是 Qt 样式表中自定义颜色的核心方式,代码示例:

复制代码
// rgb(240, 240, 240):浅灰色
this->setStyleSheet("background-color: rgb(240, 240, 240);");
  • 语法格式:rgb(红通道值, 绿通道值, 蓝通道值)
  • 取值规则:三个通道的取值范围均为0 ~ 255(整数),0 表示该通道无颜色,255 表示该通道颜色最饱和;
  • 颜色组合逻辑:
    1. 三个通道值相等时,生成灰度色:值为 0 时是纯黑色(rgb (0,0,0)),值为 255 时是纯白色(rgb (255,255,255)),值为 240 时是浅灰色(rgb (240,240,240));
    2. 三个通道值不同时,生成彩色(如 rgb (255,0,0) 为纯红色,rgb (0,255,0) 为纯绿色,rgb (0,0,255) 为纯蓝色)。

总结

  1. setStyleSheet 是 QWidget 的成员函数,通过 Qt 样式表字符串自定义控件外观,支持背景色、文本色等样式配置;
  2. 函数参数为遵循 QSS 语法的字符串,核心格式为「属性名:属性值;」,颜色值可使用预定义名称或 rgb ();
  3. rgb 颜色表示法通过红、绿、蓝三通道(0-255)组合颜色,三通道值相等时生成灰度色。
相关推荐
code_计梦星河4 小时前
Qt 开发第十三天:打卡模块跨端数据传输及连续天数计算开发
qt
誰能久伴不乏4 小时前
从数字世界到物理引擎:用 PWM 撕开 0 和 1 的结界
linux·arm开发·c++·qt
sycmancia4 小时前
QT——第一个GUI应用程序
qt
sycmancia4 小时前
Qt——窗口部件及窗口类型、坐标系统
开发语言·qt
火山上的企鹅5 小时前
QGC 二次开发实战:Android 单机离线授权怎么落地
android·qt·qgroundconrol·离线授权
不被定义的~wolf5 小时前
qt小游戏——坦克大作战
开发语言·qt
冉佳驹5 小时前
Qt 开发【第四篇】——— 常用基础、显示及输入控件核心特性概述
qt·qwidget·table widget·tree widget·text edit·boxlayout·radio button
问水っ5 小时前
Qt Creator快速入门 第三版 第7章 Qt对象模型与容器类
开发语言·qt
郝学胜-神的一滴5 小时前
图形学基础:OpenGL、图形引擎与IG的核心认知及核心模式解析
开发语言·c++·qt·程序人生·图形渲染