【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)来表示颜色。

相关推荐
曹牧28 分钟前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星1 小时前
MySQL count()函数的用法
数据库·mysql
末央&1 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花1 小时前
数据库知识复习07
数据库·作业
素玥1 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian1 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室2 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善2 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅2 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师2 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql