Qt常见控件属性使用方法
1. QWidget的enable
enable
描述了一个控件是否处于 “可用” 状态。不 “可用” 的控件会处于 “禁用” 状态。
所谓 “禁用” 指的是该控件不能接收任何用户的输入事件,并且外观会变成灰色。如果一个 widget 被禁用,则该 widget 的子元素也会被禁用。
Qt 提供了一些关于 enable
的 API :
API | 说明 |
---|---|
isEnabled() | 获得控件的可用状态 |
setEnabled() | 设定该控件是否可使用,true 表示可用,false 表示禁用 |
示例:
void Widget::on_EnabelButton_clicked()
{
if(ui->pushButton->isEnabled()==true)
{
ui->pushButton->setEnabled(false);
}
else
{
ui->pushButton->setEnabled((true));
}
}
2. QWidget的geometry
geometry
描述了一个控件的几何信息,包括x,y坐标和 width 和 height 。Qt 提供了一些关于 geometry
的 API :
API | 说明 |
---|---|
geometry() | 获取控件的位置和尺寸,返回值类型是一个 QRect ,内部包括了 x,y,width,height。 |
setGeometry(QRect) | 通过一个 QRect 来设置四个几何属性。 |
setGeometry(int x, int y, int width, int height) | 通过分别设置四个几何属性来调整控件。 |
相对于
move()
而言,setGeometry()
既可以移动位置,也可以改变控件大小。
注意在使用 setGeometry()
的两个重载时,两个函数的效果可能会不同,通过直接使用 QRect
类型的变量来设置控件的 x
和 y
的值,会连带改变控件的 width
和 height
。如果真的想要让控件达到平移的效果,必须要使用分别设置四个属性的重载接口。
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_UP_Button_clicked()
{
QRect rect=ui->walk_Button->geometry();
ui->walk_Button->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());
}
void Widget::on_RIGHT_Button_clicked()
{
QRect rect=ui->walk_Button->geometry();
ui->walk_Button->setGeometry(rect.x()+5,rect.y(),rect.width(),rect.height());
}
void Widget::on_LEFT_Button_clicked()
{
QRect rect=ui->walk_Button->geometry();
ui->walk_Button->setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());
}
void Widget::on_DOWN_Button_clicked()
{
QRect rect=ui->walk_Button->geometry();
ui->walk_Button->setGeometry(rect.x(),rect.y()+5,rect.width(),rect.height());
}
注意在 Qt 中,关于位置信息的原点可能存在差异,有的 API 的原点是 Widget 本体左上角(如 geometry()
和 setGeometry()
),但有的 API 的原点是 window frame 的左上角(如 frameGeometry()
和 setFrameGeometry()
)。
3. QIcon图标
QIcon
是 Qt 中描述 GUI 左上角的小图标的控件,使用与它相关的 API 可用设置窗口的 icon 图标:
API | 说明 |
---|---|
windowIcon() | 获取控件的窗口图标,返回 QIcon 对象(实践使用很少) |
setWindowIcon(const QIcon& icon) | 设置控件的窗口图标 |
设置 icon 的 API 都只针对顶层窗口使用。
在创建 QIcon
对象时,不需要在堆上创建,因为其本身就是要设置到某个 QWidget 里面,QIcon 本身释不放释放,不会影响图标的最终显示,因此不需要挂载到对象树上管理它的生命周期。
实际 QIcon 也不支持对象树,无法给它执行父对象。
另外,Windows 使用的路径分隔符是 \
,这个符号在 C++ 中会被识别成转义字符,在 Qt 中,要将其改成 /
。相对路径和绝对路径都可以使用。
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon("C:/Users/79318/Desktop/jienigui.jpg");
this->setWindowIcon(icon);
}
Widget::~Widget()
{
delete ui;
}
3.1 qrc 机制
qrc 机制是很多 GUI 框架都支持的技术,它能够允许 GUI 的使用的图片与路径无关。在设置 icon 的时候,难免会讨论绝对路径和相对路径的问题,即使使用相对路径,用户也可能会自行删除 icon 源图像文件,导致程序窗口图标没有办法显示。
qrc 机制的原理是,给 Qt 项目引入一个额外的 xml 文件(后缀名是 .qrc ),在这个 xml 中把 icon 源图像文件资源导入进来,并在 xml 中进行记录。 Qt 在编译的时候,会根据 qrc 中描述的图片信息,找到图片内容,将其转换成二进制数据,填充到 C++ 代码的相关位置,最终编译成 exe 可执行程序。如此一来,icon 就会变成可执行程序的一部分,用户无法误删。
3.2 使用 qrc 设置窗口 icon
首先在新建项里选择创建一个 .qrc
文件:
注意在创建文件时,qrc 文件不会默认添加到项目中,需要手动选择。
在这个 .qrc
文件中,先创建一个虚拟目录,再通过 Add Files 按钮添加 icon 的源图像文件到该虚拟目录下。
所谓的虚拟目录,就是这个目录并非真实存在,是 Qt 抽象出来的,只是用于方便访问和管理图片。
在 Qt 中使用 qrc ,要求图片源文件必须在与
.qrc
文件相同的目录下。否则会报错:
在书写代码时,注意在路径的头部带上 :
表示让 Qt 去 qrc 管理的文件中找:
运行项目后,就能看到 icon 变成目标图片的样子。
在 Qt 构建的 qrc_qrcicon.cpp
文件中,能看到 jienigui.jpg
被存入了一个巨大的数组中:
4. opacity不透明度
Qt 提供了一系列接口来设置控件的不透明度:
API | 说明 |
---|---|
windowOpacity() | 用于获取控件的不透明度,取值为 [0.0 , 1.0] ,其中 0.0 表示完全不透明。 |
setWindowOpacity(float n) | 用于设置控件的不透明度。 |
示例:
void Widget::on_pushButton_plus_clicked()
{
float opacity=windowOpacity();
if(opacity>1.0)
{
return;
}
this->setWindowOpacity(opacity+0.1);
}
void Widget::on_pushButton_substrct_clicked()
{
float opacity=windowOpacity();
if(opacity>1.0)
{
return;
}
this->setWindowOpacity(opacity-0.1);
}
其实在
setWindowOpacity()
内部本身就有对于不透明度取值限制的设计,这里写上限制判断是为了良好的代码风格。
虽然代码中每次对窗口的不透明度调整都是
0.1
的幅度,但由于浮点数计算方式的原因,实际每次调整的值都不是0.1
:
5. cursor光标样式
cursor
(光标)是控制鼠标悬停在控件上时的样式, Qt 允许用户使用 ui 快速设置控件的 cursor,也可用通过代码的方式进行设置,另外 Qt 也支持使用 qrc 对 cursor 的样式进行自定义。
5.1 ui 设置 cursor
在 ui 界面中,可以通过属性中的 cursor 项快捷设置光标的悬停样式:
5.2 代码设置 cursor
Qt 提供了三个与 cursor 有关的API:
API | 说明 |
---|---|
cursor() | 获取当前控件的 cursor 属性,返回一个 QCursor 对象。 |
setCursor(const QCursor& cursor) | 设置控件的 cursor 样式,仅在鼠标悬停在该控件上时有效。 |
QGuiApplication::setOverrideCursor(const QCursor& cursor) | 设置全局(程序范围内)的光标样式,该函数会覆盖其他控件的 setCursor() 设置。 |
在代码中创建的 QCursor
对象不用挂载到对象树上,所以直接在栈上创建即可。在 Qt::
作用域中,包含了一系列 cursor 默认样式。
5.3 使用 qrc 自定义 cursor
这里我们使用 QPixmap
类型作为图片存储类型,我们的图片,多少会有一点大,Qt 提供了通过QPixmap
成员函数来设置图片的缩放比例。鼠标的中心位置相较于图片的位置也是可以设置的,默认情况下是图片的正中心,使用 cursor()
设置时,它是根据图片左上角为原点进行偏移的。
6. font
Qt 同提供了一些 API 和控件属性来控制控件显示的字体样式:
API | 说明 |
---|---|
font() | 获取当前 widget 的字体信息,返回 QFont 对象。 |
setFont(QFont& font) | 设置当前 widget 的字体信息。 |
属性 | 说明 |
---|---|
family | 字体家族,比如 “楷体”、“宋体” 等。 |
poinSize | 字体大小(即px)。 |
weight | 字体粗细。这个属性能精细地控制粗细程度,范围为 [0 , 99],数值越大越粗。 |
bold | 是否加粗。true 相当于 weight 为 75 ,false 相当于 weight 为 50 。 |
italic | 是否倾斜。 |
underline | 是否加下划线。 |
strikeOut | 是否加删除线。 |
这些属性使用ui 界面进行编辑会更简单快捷。
7. toolTip提示信息
toolTip
就是当鼠标悬停在某个控件上一会后,显示出来的控件提示信息。Qt 提供了两个 toolTip
有关的 API:
API | 说明 |
---|---|
setToolTip(const QString& tip) | 设置鼠标悬停在控件上的提示信息。 |
setToolTipDuring(int msec) | 设置 toolTip 的提示时间,单位是 ms ,时间到后提示消失。 |
8. focusPolicy焦点策略
foucusPolicy
指的是鼠标的焦点策略,我们的鼠标在想要在文本框上输入文字,就需要先点击文本框,此时焦点就在这个文本框上,Qt 允许我们进行多样化的控件焦点设置:
API | 说明 |
---|---|
focusPolicy() | 获取该 widget 的 focusPolicy ,返回一个 Qt::FoucusPolicy 对象。 |
setFocusPolicy(Qt::FocusPolicy policy) | 设置 widget 的 focusPolicy。 |
Qt::FocusPolicy | 说明 |
---|---|
Qt::NoFocus | 控件不会接收键盘焦点。(如用在不允许用户改变的文本框上) |
Qt::TabFocus | 控件可以通过 Tab 键接收焦点。 |
Qt::ClickFocus | 控件在鼠标点击时接收焦点。 |
Qt::StrongFocus | 控件可以通过 Tab 键和鼠标点击接收焦点。(这是 Qt::FocusPolicy 的默认值) |
Qt::WheelFocus | 类似于 Qt::StrongFocus ,同时控件也可以通过鼠标滚轮获得焦点。 |
styleSheet
styleSheet是 Qt 通过 QSS 设置 widget 的样式的属性。在 ui 界面,可以右键在菜单中点击 “改变样式表” 或者控件属性中找到 styleSheet 直接点击。
使用 QSS 支持的键值对设置格式,就可以对 widget 样式属性进行设置,但要注意的是,这些属性名称写错或格式错误,下方的 ”有效样式表 “ 也可能不会变成提示无效,且没有任何报错,只是设置不能生效。
要注意键的单词分隔用的是
-
而不是下划线_
。每个键值对用
;
间隔。只有字体设置需要使用引号,且是单引号
''
。其他键值对使用查 Qt 手册。
也可以使用代码对 widget 样式进行设置:
9. sizePolicy
使用 setSizePolicy()
可以设置控件的 sizePolicy
属性,这些属性在控件位于布局中时有较大变化。
setSizePolicy()
的第一个参数为设置水平,第二个参数为设置垂直。
枚举 | 说明 |
---|---|
QSizePolicy::Ignored | 忽略控件的尺寸,不对布局产生影响。 |
QSizePolicy::Minimum | 控件的最小尺寸为固定值,布局时不会超过该值。 |
QSizePolicy::Maximum | 控件的最大尺寸为固定值,布局时不会超过该值。 |
QSizePolicy::Preferred | 控件的理想尺寸为固定值,布局时会尽量接近该值。 |
QSizePolicy::Expanding | 控件的尺寸可以根据空间调整,尽可能占据更多空间。 |
QSizePolicy::Shrinking | 控件的尺寸可以根据空间调整,尽可能占据更小以适应空间。 |