Qt Widget控件属性详解

1. QWidget

  • 可以在Qt Creator 右侧看到 QWidget 的各种属性

2 QWidget常用属性

2.1 enabled

  • 描述了一个控件是否"可用"状态,相对于"禁用"
    • 禁用:该控件不能接收任何用户的输入事件,并且外观上是灰色的
    • 如果一个 widget 被禁用,则该 widget 的子元素也被禁用
  • isEnabled:获取到控件的可用状态
  • setEnabled:设置控件是否可用,true 表示可用,false 表示禁用
  • 禁用状态切换
cpp 复制代码
void Widget::on_pushButton_clicked()
{
    qDebug()<<"执行了槽函数!";
}

void Widget::on_pushButton_enable_clicked()
{
    // 切换第一个按钮的禁用状态
    // 1.先获取第一个按钮当前的可用状态
    bool enable=ui->pushButton->isEnabled();
    if(enable)
    {
        ui->pushButton->setEnabled(false);
    }else{
        ui->pushButton->setEnabled(true);
    }
}

2.2 geometry

  • 几何
  • geometry():获取控件的位置和尺寸,返回一个QRect,包含x,y,width,height
    • QPoint表示一个点,只有x,y
    • QRect表示一个矩形,有x,y,width,height
    • 都是小对象,里面的属性很少,占用空间也小,通常会传值来传递参数
  • setGeometry(QRect)/setGeometry(int x,int y,int width,int height)
    • 设置控件位置和尺寸
cpp 复制代码
void Widget::on_pushButton_up_clicked()
{
    // 获取到 target 本身的 geometry
    QRect rect=ui->pushButton_target->geometry();
    qDebug()<<rect;
    // 修改 target 坐标

    // rect.setY(rect.y()-5);
    // ui->pushButton_target->setGeometry(rect);
    ui->pushButton_target->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height
    ());
}
  • pressed:鼠标按下时触发。点击鼠标分为按下和抬起两步
cpp 复制代码
// 鼠标按下(未抬起时)
void Widget::on_pushButton_2_pressed()
{
    // 点击这个按钮就把这个按钮挪走
    // 可以通过生成随机数的方式,来确定按钮的新位置

    // 获取当前窗口尺寸
    int width=this->geometry().width();
    int height=this->geometry().height();

    // 重新生成按钮的位置
    int x=rand()%width;
    int y=rand()%height;

    // 移动按钮位置
    ui->pushButton_2->move(x,y);
}

2.3 window frame 窗口框架

  • 在 Qt 中,关于位置尺寸,提供了很多的 API
    • 考虑 window frame,以 window frame 左上角为原点
      • frameGeometry()
      • setFrameGeometry()
    • 不考虑 window frame,以 Widget 左上角为原点
      • geometry()
      • setGeometry()

2.4 windowTitle

  • 只能针对顶层窗口这样的 QWidget 才有效
  • windowTitle():获取控件的窗口标题
  • setWindowTitle(const QString& title):设置控件的窗口标题

2.5 windowIcon

  • 类似于 windowTitle,针对顶层窗口才有效
  • windowIcon():获取到控件的窗口图标,返回 QIcon(图标) 对象
  • setWindowIcon(const QIcon& icon):设置控件的窗口图标
  • 路径不要带中文,使用 / 或 \\ 作为路径分隔,使用相对路径
  • 优先在栈上创建图标, QIcon 自身是一个比较小的对象,创建出来之后就是要设置到某个 QWidget 里面。QIcon 对象本身是否释放影响图标最终的显示

2.5.1 qrc机制

  • qrc 机制(把外部文件"打包"进程序里)从根本上解决两个问题
    • 确保图片所在的路径在目标用户机器上存在
    • 确保图片不会被用户搞没了
    • 缺点:无法导入太大的资源文件
  • 本质:把 图片 的二进制数据,转成 C++ 代码
2.5.1.1 创建qrc文件:
  • 在项目中创建一个 qrc 文件,文件名不要带中文和特殊符号


2.5.1.2 添加资源文件
  • 创建一个"前缀"(Prefix)

    • 所谓的前缀,可以理解为虚拟的目录,是Qt自己抽象出来的
  • 点击"添加前缀"之后把前缀变为 / 即可

  • 把刚才的图片导入到资源文件中

    • 要求导入的资源文件必须在 resource.qrc 文件的同级目录,或者同级目录的子目录里

2.5.1.3 使用qrc中资源文件
  • 当代码中需要访问 qrc 中管理的文件时,就需要在路径上带有 :前缀文件名

2.6 windowOpacity

  • 透明效果,初始默认值为1
  • windowOpacity():获取控件的不透明数值,返回float,取值为0.0-1.0
    • 0.0:全透明
    • 1.0:完全不透明
  • setWindowOpacity(float n):设置控件不透明度
cpp 复制代码
void Widget::on_pushButton_add_clicked()
{
    float opacity=this->windowOpacity();
    if(opacity>=1.0)
        return;
    qDebug()<<opacity;
    opacity+=0.1;
    this->setWindowOpacity(opacity);
}


void Widget::on_pushButton_sub_clicked()
{
    float opacity=this->windowOpacity();
    if(opacity<=0)
        return;
    qDebug()<<opacity;
    opacity-=0.1;
    this->setWindowOpacity(opacity);
}
  • 两个问题
    • 透明度变化,并非是精准的
      • 浮点数用二进制和科学计数法表示,分为符号位,有效数字,指数部分
        • 小数有效数字每一位代表的分别是0.5,0.25,0.125,,,有的数字凑不出来
      • 优点:运算速度快,占用空间小
      • 缺点:有些小数无法精确表示
      • 平时写代码不要比较直接用 == 比较两个浮点数,作差,判断绝对值是否符合预期范围
      • 算钱或精度高的地方,慎用 float/double
    • 上述代码,在进行设置前,先判定了 opacity 的范围,然后再决定是否设置。这个判定其实可以不写,为啥我们仍然要写上
      • 防御性编程:别人犯错了,不会对我们自身构成太大的伤害

2.7 cursor

  • 鼠标样式
  • cursor():获取当前 widget 的 cursor 属性,返回 QCursor 对象,当鼠标悬停在该 widget 上时,就会显示出对应的形状
  • setCursor(const QCursor& cursor):设置该 widget 光标的形状,仅在鼠标停留在该 widget 上时生效
  • 上面两个是 Widget 级别的,同一个界面中,不同的控件可以设置成不同的光标
  • QGuiApplication::setOverrideCursor(const QCursor& cursor):设置全局光标的形状,对整个程序中的所有 widget 都会生效,覆盖上面的 setCursor 设置的内容
  • Qt 允许通过自定义的图片来设置光标
cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 访问到图片文件
    QPixmap pixmap(":/12.png");
    pixmap=pixmap.scaled(50,50);   //缩放图片

    // 构造光标对象
    // 默认情况下,鼠标点击时,相当于图片的左上角在进行点击
    QCursor cursor(pixmap,10,10);
    // 10,10 以图片左上角为0,0原点,找到10,10这个位置作为鼠标真正点击位置
    // 把光标设置进去
    this->setCursor(cursor);
}

2.8 font

  • 字体
  • font():获取当前 widget 的字体信息,返回 QFont 对象
  • setFont(const QFront& font):设置当前 widget 字体信息

2.9 toolTip

  • 当把鼠标悬停到一个控件的时候,就能弹出一个提示
  • setToolTip:设置 toolTip,提示内容
  • setToolTipDuration:设置 toolTip 提示的时间,单位 ms,时间到后提示消失
cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //设置两个按钮的tooltips
    ui->pushButton_yes->setToolTip("yes");
    ui->pushButton_yes->setToolTipDuration(2000);

    ui->pushButton_no->setToolTip("no");
    ui->pushButton_no->setToolTipDuration(2000);
}

2.10 focusPolicy

  • 焦点:指的是能选中某个单位,接下来的操作就都是针对该焦点元素进行了
  • 一个控件获取到焦点,主要是两种方式
    • 鼠标点击
    • 键盘的tab
  • focusPolicy():获取该 widget 的 focusPolicy,返回 Qt::FocusPolicy
  • setFocusPolicy(Qt::FocusPolicy policy):设置 widget 的 focusPolicy
  • Qt::FocusPolicy是一个枚举类型,取值如下
    • Qt::NoFocus:控件不会接收键盘焦点,像 label 这种
    • Qt::TabFocus:控件可以通过Tab键接收焦点
    • Qt::ClickFocus:控件在鼠标点击时接收焦点
    • Qt::StrongFocus:控件可以通过 Tab 键和鼠标点击接收焦点(默认值)
    • Qt::WheelFocus:类似于 Qt::StrongFpcus,同时空间也可以通过鼠标滚轮获取到焦点

2.11 styleSheet

  • 样式表:描述界面具体是啥样子
  • 格式:键值对
    • 键和值之间 : 分隔
    • 键值对和键值对之间,使用 ; 分隔
  • 计算机三原色:红蓝绿
cpp 复制代码
void Widget::on_pushButton_light_clicked()
{
    // 设置窗口样式
    this->setStyleSheet("background-color: rgb(240,240,240);");
    // 设置输入框的样式
    ui->plainTextEdit->setStyleSheet("background-color: white;color: black");
    // 设置按钮的样式
    ui->pushButton_light->setStyleSheet("color: black");
    ui->pushButton_black->setStyleSheet("color: black");
}

void Widget::on_pushButton_black_clicked()
{
    // 设置窗口样式
    this->setStyleSheet("background-color: black;");
    // 设置输入框的样式
    ui->plainTextEdit->setStyleSheet("background-color: black;color: white");
    // 设置按钮的样式
    ui->pushButton_light->setStyleSheet("color: white");
    ui->pushButton_black->setStyleSheet("color: white");
}
相关推荐
俺不要写代码2 小时前
线程启动、结束,创建线程多法、join,detach,线程的移动语义
服务器·开发语言·网络·c++
bioyigene2 小时前
成功案例|ATAC-seq+转录组+代谢组,解锁丹参酮生物合成的转录调控网络
经验分享
好家伙VCC2 小时前
# 发散创新:用 Rust实现高性能物理引擎的底层架构设计与实战在游戏开发、虚拟仿真和机器人控
java·开发语言·python·rust·机器人
m0_614619062 小时前
花了一下午学 Git,整理了一份学习笔记
笔记·git·学习
boonya2 小时前
一文读懂MCP:AI连接万物的“USB-C接口”
c语言·开发语言·人工智能
liliangcsdn2 小时前
多轮对话长上下文-向量检索和混合召回示例
开发语言·数据库·人工智能·python
leoZ2312 小时前
金仓老旧项目改造-10
开发语言·前端·人工智能·python·金仓
优化控制仿真模型2 小时前
2026年初中英语大纲词汇表1600词
经验分享·pdf
一个人旅程~2 小时前
linuxmint如何使用iphone手机上网以及如何管理iphone手机的照片和文件?需要下载哪些基础包和依赖?
linux·windows·经验分享·电脑