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");
}
相关推荐
方也_arkling6 小时前
【Java-Day08】static / final / 枚举
java·开发语言
风吹夏回7 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei117 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
eggcode7 小时前
【Qt学习】Linux(ARM架构)在线安装Qt6.x
linux·qt·学习·arm
llz_1127 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding7 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋97 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
xiaoshuaishuai87 小时前
C# 内存管理与资源泄漏
开发语言·c#
lsx2024068 小时前
SVN 检出操作
开发语言
鹏北海-RemHusband8 小时前
Go 语言进阶笔记 — 面向 JS/TS 前端开发者
笔记·golang