Bootstrap

Qt常见控件属性使用方法(enable、geometry、QIcon、qrc、opacity、cursor、font、focusPolicy、sizePolicy)

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));
    }
}

Attribute1

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 类型的变量来设置控件的 xy 的值,会连带改变控件的 widthheight。如果真的想要让控件达到平移的效果,必须要使用分别设置四个属性的重载接口。

//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())。

Attribute3

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;
}

Attribute4

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 文件:

Attribute5

注意在创建文件时,qrc 文件不会默认添加到项目中,需要手动选择。

在这个 .qrc 文件中,先创建一个虚拟目录,再通过 Add Files 按钮添加 icon 的源图像文件到该虚拟目录下。

Attribute6

所谓的虚拟目录,就是这个目录并非真实存在,是 Qt 抽象出来的,只是用于方便访问和管理图片。

在 Qt 中使用 qrc ,要求图片源文件必须在与 .qrc 文件相同的目录下。否则会报错:

Attribute7

在书写代码时,注意在路径的头部带上 : 表示让 Qt 去 qrc 管理的文件中找:

Attribute8

运行项目后,就能看到 icon 变成目标图片的样子。

Attribute9

在 Qt 构建的 qrc_qrcicon.cpp 文件中,能看到 jienigui.jpg 被存入了一个巨大的数组中:

Attribute10

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() 内部本身就有对于不透明度取值限制的设计,这里写上限制判断是为了良好的代码风格。

Attribute11

虽然代码中每次对窗口的不透明度调整都是 0.1 的幅度,但由于浮点数计算方式的原因,实际每次调整的值都不是 0.1

Attribute12

5. cursor光标样式

cursor(光标)是控制鼠标悬停在控件上时的样式, Qt 允许用户使用 ui 快速设置控件的 cursor,也可用通过代码的方式进行设置,另外 Qt 也支持使用 qrc 对 cursor 的样式进行自定义。

5.1 ui 设置 cursor

在 ui 界面中,可以通过属性中的 cursor 项快捷设置光标的悬停样式:

Attribute13

5.2 代码设置 cursor

Qt 提供了三个与 cursor 有关的API:

API说明
cursor()获取当前控件的 cursor 属性,返回一个 QCursor 对象。
setCursor(const QCursor& cursor)设置控件的 cursor 样式,仅在鼠标悬停在该控件上时有效。
QGuiApplication::setOverrideCursor(const QCursor& cursor)设置全局(程序范围内)的光标样式,该函数会覆盖其他控件的 setCursor() 设置。

在代码中创建的 QCursor 对象不用挂载到对象树上,所以直接在栈上创建即可。在 Qt:: 作用域中,包含了一系列 cursor 默认样式。

Attribute14

5.3 使用 qrc 自定义 cursor

这里我们使用 QPixmap 类型作为图片存储类型,我们的图片,多少会有一点大,Qt 提供了通过QPixmap成员函数来设置图片的缩放比例。鼠标的中心位置相较于图片的位置也是可以设置的,默认情况下是图片的正中心,使用 cursor() 设置时,它是根据图片左上角为原点进行偏移的。

Attribute15

6. font

Qt 同提供了一些 API 和控件属性来控制控件显示的字体样式:

API说明
font()获取当前 widget 的字体信息,返回 QFont 对象。
setFont(QFont& font)设置当前 widget 的字体信息。
属性说明
family字体家族,比如 “楷体”、“宋体” 等。
poinSize字体大小(即px)。
weight字体粗细。这个属性能精细地控制粗细程度,范围为 [0 , 99],数值越大越粗。
bold是否加粗。true 相当于 weight75false 相当于 weight50
italic是否倾斜。
underline是否加下划线。
strikeOut是否加删除线。

这些属性使用ui 界面进行编辑会更简单快捷。

7. toolTip提示信息

toolTip 就是当鼠标悬停在某个控件上一会后,显示出来的控件提示信息。Qt 提供了两个 toolTip 有关的 API:

API说明
setToolTip(const QString& tip)设置鼠标悬停在控件上的提示信息。
setToolTipDuring(int msec)设置 toolTip 的提示时间,单位是 ms ,时间到后提示消失。

Attribute16

8. focusPolicy焦点策略

foucusPolicy 指的是鼠标的焦点策略,我们的鼠标在想要在文本框上输入文字,就需要先点击文本框,此时焦点就在这个文本框上,Qt 允许我们进行多样化的控件焦点设置:

API说明
focusPolicy()获取该 widgetfocusPolicy ,返回一个 Qt::FoucusPolicy 对象。
setFocusPolicy(Qt::FocusPolicy policy)设置 widgetfocusPolicy
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 直接点击。

Attribute17

使用 QSS 支持的键值对设置格式,就可以对 widget 样式属性进行设置,但要注意的是,这些属性名称写错或格式错误,下方的 ”有效样式表 “ 也可能不会变成提示无效,且没有任何报错,只是设置不能生效。

Attribute18

要注意键的单词分隔用的是 - 而不是下划线 _

每个键值对用 ; 间隔。

只有字体设置需要使用引号,且是单引号 ''

其他键值对使用查 Qt 手册。

也可以使用代码对 widget 样式进行设置:

Attribute19

9. sizePolicy

使用 setSizePolicy() 可以设置控件的 sizePolicy 属性,这些属性在控件位于布局中时有较大变化。

setSizePolicy() 的第一个参数为设置水平,第二个参数为设置垂直。

枚举说明
QSizePolicy::Ignored忽略控件的尺寸,不对布局产生影响。
QSizePolicy::Minimum控件的最小尺寸为固定值,布局时不会超过该值。
QSizePolicy::Maximum控件的最大尺寸为固定值,布局时不会超过该值。
QSizePolicy::Preferred控件的理想尺寸为固定值,布局时会尽量接近该值。
QSizePolicy::Expanding控件的尺寸可以根据空间调整,尽可能占据更多空间。
QSizePolicy::Shrinking控件的尺寸可以根据空间调整,尽可能占据更小以适应空间。
;