Qt Widget控件属性详解
1. QWidget
- 可以在Qt Creator 右侧看到 QWidget 的各种属性
2 QWidget常用属性
2.1 enabled
- 描述了一个控件是否”可用“状态,相对于”禁用“
- 禁用:该控件不能接收任何用户的输入事件,并且外观上是灰色的
- 如果一个 widget 被禁用,则该 widget 的子元素也被禁用
- isEnabled:获取到控件的可用状态
- setEnabled:设置控件是否可用,true 表示可用,false 表示禁用
- 禁用状态切换
voidWidget::on_pushButton_clicked(){qDebug()<<"执行了槽函数!";}voidWidget::on_pushButton_enable_clicked(){// 切换第一个按钮的禁用状态// 1.先获取第一个按钮当前的可用状态boolenable=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)
- 设置控件位置和尺寸
voidWidget::on_pushButton_up_clicked(){// 获取到 target 本身的 geometryQRect 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:鼠标按下时触发。点击鼠标分为按下和抬起两步
// 鼠标按下(未抬起时)voidWidget::on_pushButton_2_pressed(){// 点击这个按钮就把这个按钮挪走// 可以通过生成随机数的方式,来确定按钮的新位置// 获取当前窗口尺寸intwidth=this->geometry().width();intheight=this->geometry().height();// 重新生成按钮的位置intx=rand()%width;inty=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()
- 考虑 window frame,以 window frame 左上角为原点
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 文件的同级目录,或者同级目录的子目录里
- 要求导入的资源文件必须在 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):设置控件不透明度
voidWidget::on_pushButton_add_clicked(){floatopacity=this->windowOpacity();if(opacity>=1.0)return;qDebug()<<opacity;opacity+=0.1;this->setWindowOpacity(opacity);}voidWidget::on_pushButton_sub_clicked(){floatopacity=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 允许通过自定义的图片来设置光标
Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);// 访问到图片文件QPixmappixmap(":/12.png");pixmap=pixmap.scaled(50,50);//缩放图片// 构造光标对象// 默认情况下,鼠标点击时,相当于图片的左上角在进行点击QCursorcursor(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,时间到后提示消失
Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);//设置两个按钮的tooltipsui->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
- 样式表:描述界面具体是啥样子
- 格式:键值对
- 键和值之间 : 分隔
- 键值对和键值对之间,使用 ; 分隔
- 计算机三原色:红蓝绿
voidWidget::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");}voidWidget::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");}