【QT】3.QWidget控件

目录

[1. enabled:是否可用状态](#1. enabled:是否可用状态)

[2. geometry:位置与大小](#2. geometry:位置与大小)

[3. windowFrame:窗口框架](#3. windowFrame:窗口框架)

[4. windowTitle:窗口标题](#4. windowTitle:窗口标题)

[5. windowIcon:窗口图标](#5. windowIcon:窗口图标)

[6. qrc 资源文件机制](#6. qrc 资源文件机制)

[7. windowOpacity:窗口透明度](#7. windowOpacity:窗口透明度)

[8. cursor:修改光标](#8. cursor:修改光标)

[9. font:字体相关](#9. font:字体相关)

[10. toolTip:提示文本](#10. toolTip:提示文本)

[11. focusPolicy:焦点策略](#11. focusPolicy:焦点策略)

[12. styleSheet:样式表(仿CSS的QSS)](#12. styleSheet:样式表(仿CSS的QSS))


1. enabled:是否可用状态

  • 禁用状态:控件不接受用户输入(如点击)。

  • 一个父控件被禁用,其所有子控件也会被禁用。

  • 示例:用按钮控制另一个按钮的可用状态。

    cpp 复制代码
    void Widget::on_pushButton_clicked() {
        this->setWindowTitle("开");
    }
    void Widget::on_pushButtonEnabled_clicked() {
        bool fl = ui->pushButton->isEnabled();
        if(fl) {
            ui->pushButton->setEnabled(false);
        } else {
            ui->pushButton->setEnabled(true);
        }
    }

2. geometry:位置与大小

  • 是四个属性的统称:x, y(左上角坐标),widthheight

  • QT 将它们封装在一个 QRect 类里。

  • 注意 :如果只修改 x, y 坐标,按钮的大小不会改变,只是位置移动。但如果只使用 geometry() 获取矩形然后修改 y 坐标并设置回去,按钮可能会被拉伸或压缩。这是因为 setY() 方法只是改变了矩形的 y 值,而没有保持高度。

  • 正确示例:移动按钮。

    cpp 复制代码
    void Widget::on_up_clicked() {
        auto rec = ui->pushButton->geometry();
        ui->pushButton->setGeometry({rec.x(), rec.y()-10, rec.width(), rec.height()});
    }
    void Widget::on_down_clicked() {
        auto rec = ui->pushButton->geometry();
        ui->pushButton->setGeometry({rec.x(), rec.y()+10, rec.width(), rec.height()});
    }
    void Widget::on_left_clicked() {
        auto rec = ui->pushButton->geometry();
        ui->pushButton->setGeometry({rec.x()-10, rec.y(), rec.width(), rec.height()});
    }
    void Widget::on_right_clicked() {
        auto rec = ui->pushButton->geometry();
        ui->pushButton->setGeometry({rec.x()+10, rec.y(), rec.width(), rec.height()});
    }

3. windowFrame:窗口框架

  • Widget 窗口顶端显示"Widget"字母的细条,就是 windowFrame 框架。

  • 有些 API 以窗口客户区(不含边框)的左上角为 (0, 0),有些则以包含边框的整个窗口左上角为 (0, 0)

    cpp 复制代码
    QRect r1 = this->geometry();      // 客户区矩形
    QRect r2 = this->frameGeometry(); // 包含窗口框架的矩形
    qDebug() << r1;
    qDebug() << r2;
  • 注意 :如果在构造函数中直接打印,可能会得到 (0, 0),因为此时窗口的界面可能尚未完全构造出来。应在按钮事件等窗口显示后再获取。

  • 结果示例

    cpp 复制代码
    QRect(560,264 800x600)   // geometry
    QRect(559,219 802x646)   // frameGeometry
    • 可以看出,左右各有 1 像素边框,上方标题栏高度为 46 像素。

4. windowTitle:窗口标题

  • 设置顶层窗口标题栏的文字。

  • 注意 :只能对顶层窗口(如 Widget)设置,对按钮等子控件设置是无效的。

    cpp 复制代码
    // 错误示例,不会生效
    QPushButton* q1 = new QPushButton(this);
    q1->setWindowTitle("1");

5. windowIcon:窗口图标

  • 设置窗口左上角或任务栏上显示的小图标。

  • 使用 QIcon 类管理图标。

    cpp 复制代码
    QIcon q1("d:\\1.png"); // Windows路径,注意转义
    this->setWindowIcon(q1);
  • 注意点

    • 之前按钮等控件通常用指针创建在堆上,但 QIcon 可以直接放在栈上。

      • 原因1:按钮等需要确保生命周期与父窗口一致,因此需要托管给 QT 的对象树。

      • 原因2QIcon 是一个轻量级对象,创建并设置给窗口后,即使局部 QIcon 对象析构,图标资源已经加载,不影响显示。且 QIcon 没有 setParent 方法,无法放入对象树。

    • 路径写法:

      • 可以使用 C++11 的原始字符串(Raw String)避免转义:QIcon q1(R"(d:\1.png)");

      • 在 QT 中,路径分隔符也可以使用 /QIcon q1("d:/1.png");

  • 问题 :使用绝对路径不灵活,因为不同电脑路径不同,且图片可能被用户删除。解决方案 :使用 QT 的 资源文件 (qrc) 机制。

6. qrc 资源文件机制

  • QT 资源文件(后缀 .qrc)是一个 XML 文件,用于记录项目中的资源(如图片)。

  • 编译时,QT 会将资源文件中的资源数据(如图片)以二进制形式编译进最终的可执行文件(.exe)中。

  • 优点:程序运行时无需依赖外部文件,不会被用户误删。

  • 缺点:不适合嵌入过大的文件,会导致可执行文件体积膨胀。

  • 使用步骤

    1. 在项目上右键 -> 添加新文件 -> QT -> Qt Resource File,创建 .qrc 文件。

    2. 将图片文件复制到项目目录下(通常是 .qrc 文件同级或子目录)。

    3. 在 QT Creator 中双击 .qrc 文件,点击"添加"->"添加前缀",再"添加"->"添加文件",选择图片。
      https://media/image1.png

  • 代码中使用

    cpp 复制代码
    QIcon q1(":/1.png"); // 冒号开头,然后是前缀(如果设置了)和文件名
    setWindowIcon(q1);
  • 编译后,会在构建目录生成一个 qrc_*.cpp 文件,里面包含了资源的二进制数据。

7. windowOpacity:窗口透明度

cpp 复制代码
void Widget::on_pushButton_clicked() { // 增加透明度(变得更透明)
    float f = this->windowOpacity();
    f += 0.1;
    if (f > 1.0) f = 1.0;
    this->setWindowOpacity(f);
}
void Widget::on_pushButton_2_clicked() { // 减少透明度(变得更不透明)
    float f = this->windowOpacity();
    f -= 0.1;
    if (f < 0.0) f = 0.0;
    this->setWindowOpacity(f);
}

8. cursor:修改光标

  1. 属性面板修改 :在 QT Designer 右侧属性编辑器的 cursor 栏目下方可以直接选择预设光标。

  2. 代码修改为预设光标

    cpp 复制代码
    this->setCursor(Qt::WaitCursor); // 设置为等待(转圈)光标
  3. 自定义光标图标

    cpp 复制代码
    QPixmap p(":/tu.png"); // 加载图片资源
    this->setCursor(p); // 设置为光标
    // 还可以缩放图片
    p = p.scaled(10, 10);

9. font:字体相关

  • family:字体样式(如"宋体"、"Arial")。

  • pointSize:字体大小(单位是"点",px)。

  • weight:字体粗细。范围是 0~99。bold 属性是布尔值,对应 weight 约为 75(粗)和非粗体(约 50)。

  • underline:是否有下划线。

  • italic:是否倾斜。

  • strikeOut:是否有删除线。

10. toolTip:提示文本

  • 鼠标悬停在控件上时显示的简短解释文字。​​​​​​​

    cpp 复制代码
    ui->yes->setToolTip("这是yes按钮");
    ui->yes->setToolTipDuration(2000); // 设置显示时间,单位毫秒
    ui->no->setToolTip("这是no按钮");
    ui->no->setToolTipDuration(2000);

11. focusPolicy:焦点策略

  • 设置控件如何获得焦点(如文本框可以被什么方式激活)。​​​​​​​

  • 常见选项:

    • StrongFocus:可以通过鼠标点击和键盘 Tab 键获得焦点。

    • ClickFocus:只能通过鼠标点击获得焦点。

    • TabFocus:只能通过键盘 Tab 键获得焦点。

    • NoFocus:不能获得焦点。

12. styleSheet:样式表(仿CSS的QSS)

  • 使用类似 CSS 的键值对语法来修改控件的外观(颜色、边框、背景等)。
cpp 复制代码
// 设置背景色为白色
this->setStyleSheet("background-color:white;");
// 设置文本编辑框背景为白色,文字为黑色
ui->textEdit->setStyleSheet("background-color:white;color:black");
  • 示例:实现简单的白天/黑夜模式切换

    cpp 复制代码
    void Widget::on_pushButton_clicked() { // 白天模式
        this->setStyleSheet("background-color:rgb(240,240,240);");
        ui->textEdit->setStyleSheet("background-color:white;color:black;");
        ui->pushButton->setStyleSheet("color:black;");
        ui->pushButton_2->setStyleSheet("color:black;");
    }
    void Widget::on_pushButton_2_clicked() { // 黑夜模式
        this->setStyleSheet("background-color:black;");
        ui->textEdit->setStyleSheet("background-color:black;color:white;");
        ui->pushButton->setStyleSheet("color:white;");
        ui->pushButton_2->setStyleSheet("color:white;");
    }
  • 可以使用 rgb(r, g, b) 或十六进制颜色码(如 #F0F0F0)来表示颜色。

相关推荐
ycydynq2 小时前
django 数据库 多表操作
数据库·python·django
m0_549416662 小时前
自动化与脚本
jvm·数据库·python
xiaolyuh1232 小时前
MySQL MVCC(多版本并发控制)实现机制深度解析
数据库·mysql
StarRocks_labs2 小时前
双 11 大促峰值不翻车:淘天集团 Paimon + StarRocks 大规模 OLAP 查询实战与优化
数据库·starrocks·olap·淘宝·paimon
Access开发易登软件2 小时前
Access 连接 SQL Server:直通查询 vs 链接表 vs ADO,如何选择?
前端·数据库·vba·access·access开发
小魏每天都学习2 小时前
【sql-网络拓扑-子网划分-控制流图】
数据库·sql·mysql
心态还需努力呀2 小时前
不止于 MongoDB 替代:金仓数据库多模一体的技术实践与性能实测
数据库·mongodb
Hgfdsaqwr2 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
2301_788662402 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python