『 QT 』QT控件属性全解析 (二)
文章目录
- 1 Window Frame 属性
- 1.1 验证 Window Frame
- 2 windowTitle 属性
- 3 windowIcon 属性
- 3.1 设置 windowIcon
- 3.2 QRC 方式引入资源
- 3.2.1 QRC 使用示例
- 4 windowOpacity 属性
- 4.1 windowOpacity 设置
- 5 cursor 属性
- 5.1 cursor 设置内置光标
- 5.2 cursor 设置自定义光标
- 6 font 属性
- 6.1 font 属性设置示例
- 7 toolTip 属性
- 8 focusPolicy 属性
- 8.1 focusPolicy 属性验证
- 9 补充
1 Window Frame 属性
通常情况下, 在每个Widget上都会存在一个顶格栏(标题栏), 这一栏可能会存在一些这样的元素, 譬如程序标题, 程序icon, 程序的最小化, 最大化, 关闭窗口的按键;
除了标题栏以外, 通常在Widget的外框还会存在一个细小的边框;

这些元素的集合统称Window Frame, 如上述, 是系统自带的属性;
而实际上针对QT的坐标体系通常分为两种, 一种是基于Widget框架左上角为原点, 而另一种则是基于Window Frame左上角为原点, 在QT中都提供了对应的API;
-
geometry系列geometry系列API通常是不考虑Window Frame的位置信息, 只以Widget框架作为原点计算其位置信息;提供的常用的
API为如下:-
geometry()该方法为返回以
Widget左上角为原点的位置信息, 不考虑Window Frame; -
setGeometry()该方法对控件设置位置信息, 以
Widget左上角为原点, 不考虑Window Frame;
-
-
frameGeometry系列该系列的
API通常考虑Window Frame的位置信息, 以Window Frame左上角作为原点计算器位置信息;提供的常用
API为如下:-
frameGeometry()该方法返回以
Window Frame左上角为原点的位置信息;
-
当然上述描述的前提是, 该Widget为顶级窗口而不为某个Widget的某个子控件;

通常子控件的位置都基于Widget的左上角原点进行计算, 不包括Window Frame;
除了上述的所述的两组常用API外, 还提供了其他的API, 具体如下:
| API | API 说明 |
|---|---|
x() | 获取横坐标(包含Window Frame) |
y() | 获取纵坐标(包含Window Frame) |
pos() | 返回QPoint对象, 该对象包含x(), y(), setX(), setY()等方法(包含Window Frame) |
frameSize() | 返回QSize对象, 包含width(), height(), setWidth(), setHeight()等方法(包含Window Frame) |
frameGeometry() | 返回QRect对象, 该对象相当于QPoint和QSize对象的结合体, 可以同时获取x, y, width以及size(包含Window Frame) |
width() | 获取宽度(不包含Window Frame) |
height() | 获取高度(不包含Window Frame) |
size() | 返回QSize()对象, 包含width(), height(), setWidth(), setHeight()等方法(不包含Window Frame) |
rect() | 返回QRect对象, 该对象相当于QPoint和QSize对象的结合体, 可以同时获取x, y, width以及size(不包含Window Frame) |
geometry | 返回QRect对象, 该对象相当于QPoint和QSize对象的结合体, 可以同时获取x, y, width以及size(不包含Window Frame) |
setGeometry() | 直接设置窗口的位置和尺寸, 可以同时设置x, y, width, height, 或者QRect对象(不包含Window Frame) |
1.1 验证 Window Frame
假设存在一个程序, 我们需要使用这个程序来验证Window Frame的存在并验证其与Widget的区别;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);qDebug() << geometry();qDebug() << frameGeometry();
}
在这段代码中, 我们直接运行程序, 它将会打印出geometry()以及frameGeometry()的QRect对象信息;
运行结果为如下:
QRect(0,0 514x309)
QRect(0,0 514x309)
从运行结果中可以看出, 这里的预期并不和我们想象一样, geometry()以及frameGeometry()的QRect对象信息相同甚至焦点都为(0, 0);
原因是我们需要查看的是Widget对象的属性, 也就是this指针, 而此处我们在构造函数中进行qDebug()打印时, this仍处于构造阶段, 因此此处打印出的结果是没有有效性的;
geometry属性与frameGeometry属性通常是在show()后才有效;
因此我们可以进行两种方法:
-
提前
show()的调用(可取但不推荐)此处我们需要获取
geometry()和frameGeometry()属性值, 而在此之前我们已经将所有的内容已经初始化完毕, 只剩下show()展示出程序窗口即可;因此可以将
this在构造函数中进行show()(可取但不推荐);Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);show();qDebug() << geometry();qDebug() << frameGeometry(); }运行的
qDebug()结果为:QRect(597,359 514x309) QRect(597,329 514x339) -
将该打印操作作为槽绑定在某个控件上(如
QPushButton)除上述方法之外, 我们知道
geometry()和frameGeometry()属性值需要在show()后才有效;因此可以创建一个
QPushButton按钮;
将按钮的
clicked信号绑定到对应的槽上;void Widget::on_Button_1_clicked() {qDebug() << "The button clicked";qDebug() << geometry();qDebug() << frameGeometry(); }当程序运行后构造函数已经完毕,
show()将会被调用, 此时窗口已经被展示, 同时上述的属性属于有效值, 可以通过按钮来进行获取数据;运行结果为:
The button clicked QRect(597,359 514x309) QRect(597,329 514x339)
从这些验证中可以发现, 其x与width并没有太大的差别, 较大的差别通常在y或是height上;
2 windowTitle 属性
通常情况下, windowTitle属性是从属于QWidget的, 而在QT中大多数的控件都是以QWidget为基类的;
因此实际上每个控件都有一个windowTitle属性;
但这个属性与Window Frame类似, 只有顶层窗口的该属性才是有效的;
通常可以使用setWindowTitle()方法来设定该属性;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("This is a windowTitle");QPushButton* button = new QPushButton(this);button->setText("Button");button->setWindowTitle("The button has a title");qDebug() << this->windowTitle();qDebug() << button->windowTitle();
}Widget::~Widget()
{delete ui;
}
在这段代码中, 我们使用了setWindowTitle()分别对this(Widget)以及新创建的QPushButton对象button进行设置标题;
运行结果为如下:

从结果中可以看出, 虽然windowTitle成功被设置进两个控件对象中(console中确实对两行qDebug()进行了打印), 但实际上能看到效果的只有Widget, 因此在很多情况下或许属性是相通的, 但不一定表示所有属性能在所有控件中存在其效果;
3 windowIcon 属性
通常情况下, 运行一个具有GUI框架的程序, 其windowFrame的顶栏将会存在对应的Icon, 同时其任务栏中也会存在对应的Icon图标;
以QTCreator为例;

其左侧有一个QT样式的Icon;
而windowIcon属性则是管理这个图标的属性;
而在一个QT应用中, 运行程序后同样也会存在一个Icon, 但通常在未设置windowIcon属性的前提下, 这个图标通常是系统默认样式;
以windows11为例:

该图即为windows11默认的可执行程序windowIcon;
当然同样的这个属性只对顶层窗口有效, 因为只有顶层窗口才存在有效的windowFrame;
关于windowIcon的API有如下:
-
windowIcon()用于获取到控件的窗口图标, 并返回
QIcon对象;这个方法通常不常用, 因为很多时候我们并不希望去获取一个窗口的
Icon; -
setWindowIcon(const QIcon& icon)用于设置控件的窗口图标;
3.1 设置 windowIcon
我们预先在阿里巴巴开源的矢量图标网站上找到所需要的Icon;

将其存放在某个我们能找到的路径下, 并重命名为英文名(QT由于编码问题, 不能很好的识别中文, 因此需要采用英文名以防止编译失败), 此处我将该矢量图标命名为Project.png;
在新项目中调用以下方法进行图标的设置:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon("F:/CppCode/qt-learning/2025/1022/Project.png");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}
在Widget构造函数中, 我们先在栈上创建了一个QIcon对象;
这里在栈上开辟对象的原因本质上是因为这里的QIcon对象我们只需短暂的借用他, 依靠他来将Icon通过Widget的setWindowTitle()方法将其存放进去, 在设置完成后, 其对象的销毁与否并不影响windowIcon的展示, 同时在QT中很多概念被封装为一个类从而方便管理, 但被封装的类并不代表他是一个有效的控件, 而通常情况下, 很多非独立窗口的控件需要被挂在对象树上, 而很明显QIcon对象并不是一个子控件, 因此无需再堆上进行开辟空间再进行释放以简化操作;
在创建QIcon对象时, 我们需要输入一个字符串的路径来让QIcon对象找到我们所持有的Icon图标, 在传入路径时需要注意\的使用以避免路径中存在转义字符从而导致路径失效;
程序运行结果如下:

与此同时, 任务栏中的Icon也同时进行变化;

3.2 QRC 方式引入资源
在上文中采用了绝对路径的方式进行windowIcon的设置, 但实际上这种方式并不是十分安全的方式;
通常情况下, 如果在将资源以绝对路径或者相对路径的方式将项目进行打包可能会出现某些问题;
-
绝对路径
采用绝对路径的方式将资源进行打包时, 可能会出现由于不同用户的分盘情况不同导致某些用户没有对应的路径, 如: 将资源打包至
D盘但用户没有D盘; -
相对路径
虽然采用相对路径的方式将资源固定在以可执行程序所在路径为当前路径的某个相对路径中, 我们无法保证该资源不会被用户误删所导致资源加载失败;
为了防止相应问题的发生, QT引入了一种资源管理方式, 即QRC机制;
这种方式本质是创建一个.qrc文件, 并在该文件中创建一个虚拟的路径, 本质上是在qmake工具中, 将对应的文件已以二进制的形式编码进某个.cpp文件中以数组的方式进行存储, 当程序运行后, 这个.cpp文件将会被编译进可执行程序中, 对应的将从该数组下获取二进制数据并进行展示, 最终将原有的资源进行展出;
当然因为QRC的特殊机制, 导致我们无法使用该机制来保存较大的资源文件;
3.2.1 QRC 使用示例
以上文代码为例, 需要将windowIcon以qrc的方式引入项目中;
前提是需要在QT Creator中创建一个 .qrc 文件;
操作步骤为:
-
文件 -> 新文件 ->
Qt->Qt Resource File-> 选择(确定)
在文件命名中对文件命名后(此处命名为
Resource), 将该.qrc文件添加到项目中;
最终
Resource.qrc文件将会被添加到项目中;
在QT Creator中.qrc文件的样式为如下;

我们通常先为其添加前缀, 再进行添加文件(此处前缀定义为/);
在进行文件的添加时, 需要保证该文件在.qrc文件的同级目录下, 否则文件会添加失败;

这里可以直接点击 “复制” 后将文件保存在需要的位置, 即资源文件的同级目录;
而后资源将会被添加完毕;

添加后即可以正常使用, 代码如下:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/Project.png");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}
当然由于QRC机制是虚拟路径, 因此不需要给出明确的盘符, 只需要以:进行开头, 而后跟上资源所在QRC资源文件的位置即可;
运行结果如下:

在项目构建后, 在整个项目结构中可以找到一个命名为qrc_[qrc_file_name].cpp文件, 由于在上文中我将.qrc文件命名为Resource.qrc, 因此这个.cpp文件为qrc_Resource.cpp文件, 这个文件中即为QRC通过moc元编程所生成的存放资源的.cpp文件;

在这个.cpp文件中开辟了一个静态数组, 数组中存放的数据即为Project.png的二进制元数据;
4 windowOpacity 属性
该属性主要用来控制窗口的透明度;
其相关API为如下:
-
windowOpacity()获取当前不透明度的值, 返回值为一个
float类型, 取值范围为0.0 ~ 1.0, 其中0.0表示完全透明,1.0表示完全不透明; -
setWindowOpacity(float n)该方法用来设置
Widget的不透明度, 通常可配合windowOpacity()来进行窗口的不透明度加减;
需要注意的是, 该属性同样只对顶层窗口有效;
4.1 windowOpacity 设置
假设在QWidget中存在两个QPushButton对象, 其中两个对象的objectName分别为:
-
SubOpacity减少不透明度, 每次减少
0.03(最小值设置为0.3以避免找不到按钮); -
AddOpacity增加不透明度, 每次增加
0.03;

并在两个QPushButton对象中分别设置槽:
void Widget::on_add_opacity_clicked()
{float val = this->windowOpacity();val+=0.03;if(val>1.0){val = 1.0;}this->setWindowOpacity(val);qDebug() << "Opacity: " << val;
}void Widget::on_sub_opacity_clicked()
{float val = this->windowOpacity();val-=0.03;if(val<0.3){val = 0.3;}this->setWindowOpacity(val);qDebug() <<"Opacity: " << val;
}
运行结果为如下:

从结果可以看出, 在进行windowOpacity设置时, 虽然定的值都为0.03, 但实际上变化的似乎并不精确, 这是因为浮点数的存储是采用IEEE754的标准进行存储, 不精确但计算时快速;
这里使用了限制的方式限制了Opacity的最大与最小值, 但实际上在setWindowOpacity()内中本就进行了限制, 此处进行double check的原因是出于一种 “防御性编程思想” ;
5 cursor 属性
该属性为鼠标悬停时鼠标形状;
通常情况下, 我们的鼠标样式为一种指针箭头;

当遇到文本时, 鼠标的形状将会是一个大写的I状;

同样的当遇到可点击的内容时, 鼠标的悬停状态将会变为一个指向上的手指形状, 以此类推…;

在QT中大部分的控件都存在这种属性, 同时也内置了许多默认的cursor样式, 对应的样式可以在QT Designer中的右侧属性编辑栏中的cursor中看到;

可以直接在QT Designer中直接对对应的控件进行修改内置的cursor;
除此之外, QT允许用户通过API的方式来获取或者设置cursor属性, 在widget级别的同一个界面中, 不同的控件可以设置成不同的光标;
相关的API为如下:
-
cursor()该接口用于获取当前
Widget的cursor属性, 返回的是一个QCursor对象; -
setCursor(const QCursor& cursor)该接口用于设置该
widget光标的形状, 仅在鼠标停留在该widget时生效; -
QGuiApplication::setOverrideCursor(const QCursor& cursor)该接口用于设置全局光标的形状, 对整个程序中的所有
widget都会生效, 同时该接口会覆盖setCursor()的设置内容;
5.1 cursor 设置内置光标
关于如何在QT Designer中去设置内置光标由于操作过于简单, 此处不进行描述;
此处主要通过代码的方式动态的去设置cursor属性;
在QT中已经对很多内置的光标进行了定义, 可以直接通过:
{QCursor cursor(Qt::[cursorName]);[widgetObjectName]->setCursor(cursor);
}
通过这种方式来设置内置光标, 如:
{QCursor cursor(Qt::WaitCursor);ui->pushButton->setCursor(cursor);
}
其中Qt::WaitCursor只是众多光标中的一种, QT早已对这些光标进行了定义;
在qnamespace.h文件中可以找到对这些光标的枚举:
enum CursorShape {ArrowCursor,UpArrowCursor,CrossCursor,WaitCursor,IBeamCursor,SizeVerCursor,SizeHorCursor,SizeBDiagCursor,SizeFDiagCursor,SizeAllCursor,BlankCursor,SplitVCursor,SplitHCursor,PointingHandCursor,ForbiddenCursor,WhatsThisCursor,BusyCursor,OpenHandCursor,ClosedHandCursor,DragCopyCursor,DragMoveCursor,DragLinkCursor,LastCursor = DragLinkCursor,BitmapCursor = 24,CustomCursor = 25};
根据上述的部分代码, 在这里补全所有代码随后进行演示:
-
使用
QTDesigner在xml的.ui文件中对widget创建一个objectName为pushButton的按钮
-
在
widget的构造函数中创建一个QCursor临时对象并对该控件的cursor进行setCursor修改Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QCursor cursor(Qt::WaitCursor);ui->pushButton->setCursor(cursor); } -
运行结果为如下

当光标移动到
PushButton后, 指针将变成等待状态;
在上述例子中我们使用的是setCursor()方法进行设置, 可以观察到Widget的指针效果与PushButton中的指针效果不同;
当然我们可以将其修改成QGuiApplication::setOverrideCursor(const QCursor& cursor)的方式来设置全局光标;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
// QCursor cursor(Qt::WaitCursor);
// ui->pushButton->setCursor(cursor);QCursor cursor(Qt::BusyCursor);QGuiApplication::setOverrideCursor(cursor);
}
在此处将cursor的样式修改为BusyCursor, 并使用QGuiApplication::setOverrideCursor()方法进行设置;
运行结果为如下:

从结果可以观察到, 全局所设置的cursor属性有效范围也包括windowFrame;
需要注意的是, 如果设置了全局的光标, 需要再某些时刻使用方法QGuiApplication::restoreOverrideCursor()来恢复, 否则这种覆盖是永久性的;
5.2 cursor 设置自定义光标
与windowIcon相同, Cursor同样支持自定义光标设置;
首先在QTDesigner中对Widget创建一个QPushButton对象, 其objectName为button, 设置的text为"Click Me";

同样的在阿里巴巴矢量图库中找到以下三个光标:



在这个例子中需要做到的效果是, 当鼠标移动至Widget中, 其光标效果为 "光标1"info.png, 当鼠标移动至button时, 鼠标光标效果为 "光标2"inbutton.png, 当鼠标按下button时, 光标效果为 "光标3"press.png, 松开button时, 光标将会变回 "光标2"inbutton.png;
步骤为如下:
-
获取图片元素(先以
info.png为准进行局部理解)通常情况下在
QT中获取图片元素, 较常用的是使用QPixmap进行获取, 同时在QCursor的设置中支持传入一个QPixmap图片元素, 而QPixmap允许从路径中获取图片信息;该处
info.png的路径为"F:/CppCode/qt-learning/2025/1022/CustomCursor/info.png";Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QPixmap info("F:/CppCode/qt-learning/2025/1022/CustomCursor/info.png"); } -
对获取图片定义大小(先以
info.png为准进行局部理解)当然我们可能在对图片进行获取时, 对图片的尺寸大小是未知的;
在
QPixmap中提供了一个接口为scaled(n, m), 该接口允许传入一个n * m的尺寸, 其中单位为px(像素), 该接口不会修改原对象, 而是会返回一个新的QPixmap对象为处理后的对象, 一方面是对原对象进行留存以免后续将可能使用到;为了防止光标图片过大, 我们可以将其固定在某一个大小位置
(40, 40);Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QPixmap info("F:/CppCode/qt-learning/2025/1022/CustomCursor/info.png");info = info.scaled(40, 40); } -
将光标对象设置进
Cursor属性中(先以info.png为准进行局部理解)在第一步中提到,
QCursor支持传入一个Pixmap作为光标进行传入;剩余的设置, 如
setCursor()与设置内置光标相同, 即传入一个QCursor对象即可;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QPixmap info("F:/CppCode/qt-learning/2025/1022/CustomCursor/info.png");info = info.scaled(40, 40);QCursor cursor_info(info);this->setCursor(cursor_info); } -
设置
button的槽需要注意的是, 这里我们需要设定的效果为, 点击变化, 释放时取消变化(恢复);
因此我们需要设置两个信号触发, 分别为
QPushButton::clicked()与QPushButton::released();void Widget::on_button_pressed() {} // 按下 void Widget::on_button_released() {} // 释放 -
完整代码
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QPixmap info("F:/CppCode/qt-learning/2025/1022/CustomCursor/info.png");info = info.scaled(40, 40);QPixmap inbutton("F:/CppCode/qt-learning/2025/1022/CustomCursor/inbutton.png");inbutton = inbutton.scaled(40, 40);QCursor cursor_info(info);QCursor cursor_inbutton(inbutton);this->setCursor(cursor_info);ui->button->setCursor(cursor_inbutton); }Widget::~Widget() {delete ui; }void Widget::on_button_pressed() {QPixmap press("F:/CppCode/qt-learning/2025/1022/CustomCursor/press.png");press = press.scaled(40, 40);QCursor cursor_press(press);ui->button->setCursor(cursor_press); }void Widget::on_button_released() {QPixmap inbutton("F:/CppCode/qt-learning/2025/1022/CustomCursor/inbutton.png");inbutton = inbutton.scaled(40, 40);QCursor cursor_inbutton(inbutton);ui->button->setCursor(cursor_inbutton); } -
运行结果

在这个例子中对Pixmap使用的是绝对路径的方式, 除此之外还可以使用qrc机制;

对应的完整代码为如下:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPixmap info(":/info.png");info = info.scaled(40, 40);QPixmap inbutton(":/inbutton.png");inbutton = inbutton.scaled(40, 40);QCursor cursor_info(info);QCursor cursor_inbutton(inbutton);this->setCursor(cursor_info);ui->button->setCursor(cursor_inbutton);
}Widget::~Widget()
{delete ui;
}void Widget::on_button_pressed()
{QPixmap press(":/press.png");press = press.scaled(40, 40);QCursor cursor_press(press);ui->button->setCursor(cursor_press);
}void Widget::on_button_released()
{QPixmap inbutton(":/inbutton.png");inbutton = inbutton.scaled(40, 40);QCursor cursor_inbutton(inbutton);ui->button->setCursor(cursor_inbutton);
}
当然在设置光标时其还具有其他属性, 例如可以设置光标的热点(有效点击域);
通常可以使用如QCursor cursor_inbutton(inbutton, 0, 0)的方式进行传参设置;
6 font 属性
font属性通常是设置当前widget中的字体的属性;
其常用的API有如下:
-
font()获取当前
widget的字体信息, 并返回QFont对象; -
setFont(const QFont& font)设置当前
widget的字体信息;
QFont是QT对字体所封装的一个类, 其封装了字体的基本属性;
关于QFont的属性有如下:
| 属性 | 说明 |
|---|---|
family | 字体家族, 比如 “楷体” , “仿宋” 等 |
pointSize | 字体大小(单位px) |
weight | 字体粗细, 以数值方式表示粗细程度, 其取值范围为[0, 99], 数值越大越粗 |
bold | 是否加粗, 设置为true, 相当于weight为75, false相当于weight为50 |
italic | 是否倾斜 |
underline | 是否带有下划线 |
strikeOut | 是否带有删除线 |
通常在QTDesigner中也可以直接通过鼠标的方式进行字体样式的变化, 较为简单, 此处不进行描述;
而通常用代码的方式设置字体时, 通常需要创建一个QFont对象, 通过其对应的API修改其对应的属性, 最终将这个QFont通过setFont(font)的方式设置该widget的字体样式;
6.1 font 属性设置示例
创建一个QT程序, 其功能为点击按钮变换Lable的样式;
-
首先通过
QTDesigner在widget中创建一个QLabel与QPushButton其中
QLable对象的objectName为lable,QPushButton的objectName为button;
-
为
button创建clicked()信号的槽void Widget::on_button_clicked() {if(ui->label->font().bold() == true){QFont font; // 创建一个空的 QFont 对象ui->label->setFont(font); // 重置 font 属性}else{QFont font; // 创建一个空的 QFont 对象font.setFamily("华文楷体"); // 设置字体家族为 "华文楷体"font.setBold(true); // 设置确认加粗font.setPointSize(25); // 设置字体大小为 25 pxfont.setItalic(true); // 设置字体倾斜font.setUnderline(true); // 设置字体下划线font.setStrikeOut(true); // 设置字体删除线ui->label->setFont(font); // 将 QFont 设置进 label 中} } -
运行结果

结果所示, 当点击button后, label的样式会发生改变, 其他不进行赘述;
7 toolTip 属性
在QT中存在一个属性为toolTip属性,该属性能够为对应的widget设置对应的提示;
其提供的API主要为两种:
-
setToolTip()设置
toolTip, 鼠标悬停在对应的widget上将会有提示说明; -
setToolTipDuring()设置
toolTip的提示时间, 单位为ms, 时间到后toolTip自动消失;
此处存在一段代码演示该属性的设置方式;
存在两个QPushButton, 其objectName分别为yesButton与noButton;

在widget中设置对应的toolTip, 且显示时长均为500ms;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->yesButton->setToolTip("It's a button to yes");ui->yesButton->setToolTipDuration(500);ui->noButton->setToolTip("It's a button to no");ui->noButton->setToolTipDuration(500);
}
运行结果如下:

8 focusPolicy 属性
该属性是用来获取与设置焦点的;
在QT框架中, 焦点是指GUI中控件的焦点管理机制, 其决定了哪个控件当前"活跃"或接收用户的键盘输入, 事件等;
简单来说, 当一个控件获取到焦点时, 其可以响应键盘按键(如Enter提交表单, 方向键导航), 其他控件则不会, 这是一种用户交互设计, 帮助用户通过键盘(如Tab)或鼠标在界面元素间切换;
focusPolicy提供了两个API:
-
focusPolicy()用户获取该
widget的focusPolicy, 返回Qt::FocusPolicy; -
setFocusPolicy(Qt::FocusPolicy policy)设置
widget的focusPolicy;
其中Qt::FocusPolicy是一个枚举类型, 其取值通常有如下:
-
Qt::NoFocus表示控件不会接收焦点;
-
Qt::TabFocus表示控件可以通过
Tab接收焦点; -
Qt::ClickFocus表示控件可以在鼠标点击时接收焦点;
-
Qt::StrongFocus表示控件可以通过
Tab键和鼠标点击接收焦点(默认值); -
Qt::WheelFocus类似于
Qt::StrongFocus, 同时控件也通过鼠标滚轮获取到焦点;
8.1 focusPolicy 属性验证
在下列示例中, 均使用四个Line Edit进行验证;

对应的objectName分别为lineEdit, lineEdit_2, lineEdit_3, lineEdit_4;
-
不接收焦点
当
focusPolicy设置为Qt::NoFocus时, 对应控件将无法获取焦点;在第二个
LineEdit中将focusPolicy属性设置为Qt::NoFocus;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit_2->setFocusPolicy(Qt::NoFocus); }运行结果如下:

从结果可以看出, 设置为
NoFocus后, 无论是Tab还是鼠标点击, 都无法让其获取焦点; -
只接收
Tab焦点不接收鼠标焦点使用
Qt::TabFocus可以让对应的widget不获取鼠标焦点, 只获取Tab焦点;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit_2->setFocusPolicy(Qt::TabFocus);ui->lineEdit_3->setFocusPolicy(Qt::TabFocus); }运行结果如下:

从结果看出, 当设置为
Qt::TabFocus时, 对应的控件只能接受Tab焦点, 无法接收鼠标点击焦点; -
只接收鼠标点击焦点
使用
Qt::ClickFocus属性将使对应的widget只能获取对应的点击焦点而无法获取Tab键盘焦点;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->lineEdit_2->setFocusPolicy(Qt::ClickFocus);ui->lineEdit_3->setFocusPolicy(Qt::ClickFocus); }运行结果如下:

从结果看出, 设计
ClickFocus的EditLine只能接受鼠标焦点, 无法接受Tab焦点; -
既可以接受到鼠标焦点, 也可以接收到键盘焦点
通常
Qt::StrongFocus使得控件既能够接收到键盘焦点, 也可以接收到鼠标焦点;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit_2->setFocusPolicy(Qt::StrongFocus);ui->lineEdit_2->setFocusPolicy(Qt::StrongFocus); }运行结果如下:

从结果可以看出, 使用该属性的
focusPolicy既能够接收鼠标焦点, 也可以接收键盘焦点;实际上
focusPolicy的属性默认值为strongPolicy; -
接收鼠标滚轮焦点
通常情况下使用
Qt::WheelFocus来设置焦点岁鼠标滚轮进行变化;由于较少使用, 此处不进行演示;
9 补充
通常情况下的属性设置既可以用QTDesigner的方式, 也可以直接使用代码的方式, 通常如果直接使用QTDesigner的话其属性通常是静态的;
通常widget的属性我们常使用静态设置初始样式属性, 而后根据情况变化通过代码进行调整;
